紐づいた別のモデルのフィールドを結合する
class TestController < ApplicationController def index @employees = Employee.joins(:sales).select('name, sales.amount') end end
別のモデルのデータを埋め込んで取得するには、
の形式で記入します。
上の例では、EmployeeモデルにSaleモデルを結合し、EmployeeモデルのnameフィールドとSaleモデルのamountフィールドのデータを取得しています。
joinで結合時には結合するモデルのデータがないものは取得しません。
上の例だと紐づいたSaleモデルのないemployeeのデータは取得しません。
紐づいたモデルのデータがないものも取得したいときは
の形式で記入してください。
また、このようにデータを結合していて、取得したフィールドのデータのみを使用するときはN+1問題も発生しないのでincludesを使用する必要がありません。
モデル.joins(:埋め込むモデル).select(取得するフィールド)
の形式で記入します。
上の例では、EmployeeモデルにSaleモデルを結合し、EmployeeモデルのnameフィールドとSaleモデルのamountフィールドのデータを取得しています。
joinで結合時には結合するモデルのデータがないものは取得しません。
上の例だと紐づいたSaleモデルのないemployeeのデータは取得しません。
紐づいたモデルのデータがないものも取得したいときは
モデル.left_joins(:埋め込むモデル).select(取得するフィールド)
の形式で記入してください。
また、このようにデータを結合していて、取得したフィールドのデータのみを使用するときはN+1問題も発生しないのでincludesを使用する必要がありません。