

【実現したい事】  
①１対多の関係にあるテーブルがあり、子関係にあるテーブルのカラムの値を取り出したい  
②取り出したものを合算してViewで表示させたい（＝赤枠部分の合計練習時間を表示させたい）

[![画像の説明をここに入力](https://i.stack.imgur.com/OWyPC.png)](https://i.stack.imgur.com/OWyPC.png)

【環境】 ※未経験からエンジニア転職を目指してオリジナルアプリを開発中の者です（学習期間約2ヶ月程度）。  
・Ruby：2.6.5  
・Rails:5.2.4.3  
・DB設計 ※詳細は下記コード  
親：Recordテーブル  
子：Practiceテーブル

【試した事】  
①Controllerのindexアクションに、total_practice_timeという新しい変数を宣言し、子レコード（Practiceテーブル）モデルの配列「:practices」を代入させる

②次の処理で、ブロック引数|total|を定めて、格納されているpractice_timeの値を全て足し算したものを結果として取り出す処理をする

しかし、「Syntax error」と出ており、何をどう直すべきか分からないため、ご意見・アドバイスを頂戴できますと幸いです。

**records_controller.rb**

[code]

      def index
        @records = current_user.records.includes(:practices).page(params[:page]).per(8)
    
        total_practice_time = Record.includes(:practices)
          total_practice_time.each do |total|
            total.sum(:practice_time)
          end
        end
    
[/code]

**index.html.slim**

[code]

    h1 練習記録一覧
    .container
      .row
        .col-sm-6
          .form-group
            = form_with model: @record do |f|
              = f.date_field :training_date
    
    table.table-hover.table-respnsive
      thead
        tr
          th 練習日
          th 登録日時
          th 総練習時間
          th
          th
      tbody
        - @records.each do |record|
          - record.practices.each do |practice|
            tr
              td= link_to record.training_date, record_path(record)
              td= record.created_at
              td= total
              / td= practice.practice_time
              td
                = link_to '編集する', edit_record_path(record), class: 'btn btn-primary mr-3'
                = link_to '削除する', record_path(record), method: :delete, data: { confirm: "練習記録を削除します。よろしいですか？" }, class: 'btn btn-danger'
    
[/code]

【コード】

**Recordモデル**

[code]

    class Record < ApplicationRecord
      validates :learning_point, presence: true
      validates :training_date, presence: true
    
      belongs_to :user
      has_many :practices, dependent: :destroy
      accepts_nested_attributes_for :practices
    end
    
    
[/code]

**Practiceモデル**

[code]

    class Practice < ApplicationRecord
      validates :practice_item, presence: true
      validates :practice_time, presence: true
      belongs_to :record
    end
    
[/code]

**shema.rb**

[code]

    ActiveRecord::Schema.define(version: 2020_05_25_064157) do
    
      create_table "records", force: :cascade do |t|
        t.string "user_id"
        t.text "learning_point"
        t.date "training_date"
        t.datetime "created_at", null: false
        t.datetime "updated_at", null: false
      end
    
      create_table "practices", force: :cascade do |t|
        t.string "practice_item"
        t.integer "practice_time"
        t.bigint "record_id"
        t.datetime "created_at", null: false
        t.datetime "updated_at", null: false
        t.index ["record_id"], name: "index_practices_on_record_id"
      end
    
[/code]


CC BY-SA 4.0
2020-06-16T05:36:22.123
67710
2020-06-17T12:30:31.050
39475
question
ruby-on-rails ruby
Rails　Controller　１対多関係にあるテーブルのカラムの値を取り出し、合算したものをViewで表示させたい


こんばんは。

ざっと質問を読ませていただきました。  
やりたいこととしては、子モデルであるpracticeのpractice_time合計を出し、recordの一覧に並べて表示したいということかなと思いました。  
とすると、view側index.html.slimで以下のような書き方ができるのではと思いますが、いかがでしょうか？

[code]

      tbody
        - @records.each do |record|
          tr
            td= link_to record.training_date, record_path(record)
            td= record.created_at
            td= record.practices.sum(:practice_time)
    
[/code]

他にもいろいろ実現方法はあると思いますが、上記がある程度シンプルかなと。  
もしやりたいことと異なっていたらすみません！


CC BY-SA 4.0
2020-06-16T18:19:40.487
67736
2020-06-16T18:19:40.487
40685
67710
answer


Syntax Error
自体はおそらく下の部分で起きています。一見ブロックを始めているように見えますが、`Record.includes(:practices)`
だけではブロックが始まりません。`do ... end` または `{ ... }` が必要です。

[code]

    total_practice_time = Record.includes(:practices)
      total_practice_time.each do |total|
        total.sum(:practice_time)
      end
    end
    
[/code]

また、中にある `total_practice_time.each` というのも怪しそうです。

合計を計算したいのであれば、モデルで sum を取るのがシンプルかなと思います。Record
モデルに下のようにメソッドを作ってビューで参照する形です。またこのくらい簡潔であれば [Awakichi
さんの回答](https://ja.stackoverflow.com/a/67736/19110)のようにビューで計算してしまっても良さそうです。

[code]

    def total_practice_time
      practices.sum(:practice_time)
    end
    
[/code]

※ただしこれは N+1 クエリなことに注意してください。データ量によっては直す必要があります。


CC BY-SA 4.0
2020-06-16T22:12:02.253
67742
2020-06-17T12:30:31.050
2020-06-17T12:30:31.050
19110
19110
67710
answer