10일(1): 마스터(DB에 정보를 입력하여 페이지로 내보내기

18284 단어 MySQLRubyRails
지난번에 대학생 데이터를 처리한 곳은 여기였어요.

사용 환경


호스트 운영 체제: Windows10 홈 페이지
가상 환경 운영 체제: Ubuntu Bento/Bionic
Ruby:2.51
Rails:5.2.2

테이블 연관도



마지막 프로세스

  • rails new의 Scaffold
  • Student, Subject, Club, ExamResult(가운데), ClubStudent(가운데)표의 제작
  • app/models에서 각 표의 관련성 정의
  • 메인 키 측표에 데이터를 입력합니다
  • 이번 절차.

  • 중간표에 데이터를 입력합니다
  • 성별 0or1의 표기를male or female로 변경합니다
  • Student show 페이지에서 각 학생의 시험 결과 등 데이터를 출력합니다
  • 실제 단계


    Students show 페이지의 이전 상태

    학생 데이터와 연결될 때

    student1 = Student.first
    student1.clubs << Club.first
    student1.save
    

    데이터 입력


    학생의 동아리 활동 정보
    id1에서 id100까지의 학생들을 0~4개 동아리 활동에 참가시키다(선택항은 13부).
    (1..100).each do |i|
      student = Student.find(i)
      1.upto(rand(0..4)) do
        student.clubs << Club.find(rand(1..13))
        student.save
      end
    end
    
    학생 시험 결과 정보
    id100까지 9과목 시험을 보게 하세요.
    또 점수는 0점에서 과목별로 설정된 최대점까지 무작위
    
    (1..100).each do |i|
      student = Student.find(i)
      1.upto(9) do |num|
        sub = Subject.find(num)
        exam_res = ExamResult.new
        exam_res.name = "試験#{num}"
        exam_res.score = rand(1..sub.max_score)
        exam_res.subject = sub
        student.exam_results << exam_res
        student.save
      end
    end
    

    Students의 index 페이지 태그 변경


    app/models/studetns.rb
    enum gender: { male: 0 ,female: 1}
    enum age: {"teen": 0, "twenty": 1}
    
    app/views/_form.html.erb
    <div class="field">
        <%= form.label :gender %>
        <%= form.radio_button :gender, 'male' %>男性
        <%= form.radio_button :gender, 'female' %>女性
    </div>
    <div class="field">
        <%= form.label :age %>
        <%= form.radio_button :age, '20代' %>20代
        <%= form.radio_button :age, '30代' %>30代
    </div>
    

    출력을 고려하다

  • 모든 학생의 쇼 페이지에 표시하고 싶은 것들
  • 학생의 데이터(name,mail,gender,age,opinion)
  • 학생의 과목별 시험 결과 점수
  • 성과 전체 시험결과의 평균점, 최대점, 최소점
  • ySQL의 출력

    SELECT
        subjects.name,
        CAST(AVG(exam_results.score) as unsigned) as avg_score,
        MAX(exam_results.score) as max_score,
        MIN(exam_results.score) as min_score
    FROM
        students
    INNER JOIN exam_results
        ON students.id = exam_results.student_id
    INNER JOIN subjects
        ON exam_results.subject_id = subjects.id
    GROUP BY subjects.id, subjects.name
    
    # 出力結果
    +--------+--------------+-----------+-------+-------+
    | name   | name         | name      | score | ratio |
    +--------+--------------+-----------+-------+-------+
    | taro-1 | 一次試験     | 数学      |   181 |    91 |
    | taro-1 | 試験1        | 数学      |    61 |    31 |
    | taro-1 | 一次試験     | 国語      |   146 |    73 |
    | taro-1 | 試験2        | 国語      |   200 |   100 |
    | taro-1 | 一次試験     | 英語      |   199 |   100 |
    | taro-1 | 試験3        | 英語      |   108 |    54 |
    | taro-1 | 一次試験     | 化学      |    99 |    99 |
    | taro-1 | 試験4        | 化学      |    42 |    42 |
    | taro-1 | 一次試験     | 物理      |    62 |    62 |
    | taro-1 | 試験5        | 物理      |    56 |    56 |
    | taro-1 | 一次試験     | 生物      |    83 |    83 |
    | taro-1 | 試験6        | 生物      |    42 |    42 |
    | taro-1 | 一次試験     | 世界史    |    62 |    62 |
    | taro-1 | 試験7        | 世界史    |    83 |    83 |
    | taro-1 | 一次試験     | 日本史    |    77 |    77 |
    | taro-1 | 試験8        | 日本史    |    63 |    63 |
    | taro-1 | 一次試験     | 地理      |    81 |    81 |
    | taro-1 | 試験9        | 地理      |    15 |    15 |
    +--------+--------------+-----------+-------+-------+
    

    페이지 출력


    students_컨트롤러의show 동작 편집


    활성 레코드 쿼리 인터페이스
    app/controllers/studetns_controller.rb
    def show
        @students = Student.joins(:subjects)
                           .select('students.name, students.email, students.age, students.gender, students.opinion, subjects.id as subject_id')
                           .select('exam_results.name as exam_result_name, subjects.name as subject_name, exam_results.score')
                           .select('CAST((exam_results.score / subjects.max_score) * 100 as unsigned) as ratio')
                           .where(id: params[:id])
    
        avg_result = Student.joins(:subjects)
                            .select('subjects.id as subject_id')
                            .select('CAST(AVG(exam_results.score) as unsigned) as avg_score')
                            .select('MAX(exam_results.score) as max_score')
                            .select('MIN(exam_results.score) as min_score')
                            .group('subjects.id')
                            .order('subjects.id')
        @score_hash = {}
        avg_result.each do |avg_res|
          h = Hash.new
          h[:avg_score] = avg_res.avg_score
          h[:max_score] = avg_res.max_score
          h[:min_score] = avg_res.min_score                                                                                                                                     
          @score_hash[avg_res.subject_id] = h
        end
      end
    

    페이지 뷰 편집


    app/views/students/show.html.erb
    <table border="1">
      <tr>
        <th>科目名</th>
        <th>点数</th>
        <th>平均</th>
        <th>最高</th>
        <th>最小</th>
      </tr>
      <% @students.each do |student| %>
        <tr>
          <td><%= student.subject_name %></td>
          <td><%= student.score %></td>
          <td><%= @score_hash[student.subject_id][:avg_score] %></td>
          <td><%= @score_hash[student.subject_id][:max_score] %></td>
          <td><%= @score_hash[student.subject_id][:min_score] %></td>
        </tr>              
      <% end %>
    </table>
    

    페이지 출력 결과



    매번 스스로 코드를 고려해도 결과는 자신의 힘으로 도달할 수 없다
    이번 출력도 강사가 정답으로 제시한 코드다.
    보면 저렇게 되지만 아직 인코딩을 다 할 수는 없어요.

    좋은 웹페이지 즐겨찾기