0

こんにちは私はここで何かが欠けていますか?ロード時に結合を含めることに関するドキュメントを読み、以下を試しました。「include」を使用すると、インクルードされた結合が目的のデータを出力しないことがわかりますが、事後に明示的に結合モデルを呼び出すと、目的のデータがあることがわかります。以下は、IRBでの私のモデルと動作です。

class Appearance < ActiveRecord::Base
  belongs_to :photo
  belongs_to :person
end


class Photo < ActiveRecord::Base
  belongs_to :event
  has_many :appearances, order: 'position'
  has_many :people, :through => :appearances
end


class PhotosController < ApplicationController
  def index
    @event            = Event.find(params[:event])
    @photos           = @event.photos.includes(:people, :appearances)
    # this does not show any appearance records, however this does
    # @photos           = @event.photos.first.people
  end
end

#IN IRB
 Photo.find(51941, :include => [:people, :appearances])
  Photo Load (0.4ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 51941 LIMIT 1
  Appearance Load (0.3ms)  SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position
  Person Load (0.2ms)  SELECT `people`.* FROM `people` WHERE `people`.`id` IN (12103)

 => #<Photo id: 51941, time_created: "165732-0500", copyright_notice: "", country_primary_location_name: "", date_created: "20110119", created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 21:17:41", event_id: 602, position: 102, visible: nil, filename: "RAS_4824.JPG", folder: "", image: nil, image_file_name: nil, image_content_type: nil, image_file_size: nil, image_updated_at: nil> 

1.9.3p194 :036 > Photo.find(51941).appearances
  Photo Load (0.4ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 51941 LIMIT 1
  Appearance Load (0.4ms)  SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` = 51941 ORDER BY position
 => [#<Appearance id: 73654, photo_id: 51941, person_id: 12103, created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 07:33:24", position: 1>] 
4

1 に答える 1

1

のポイントを誤解していると思いますincludes。使用includes(またはinclude検索するオプション)は、親をロードすると同時にDBからアソシエーションをロードするようにrailsに指示します。これは、2行からわかるように、IRBセッションで発生しています。

Appearance Load (0.3ms)  SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position
Person Load (0.2ms)  SELECT `people`.* FROM `people` WHERE `people`.`id` IN (12103)

結果をコンソールに出力するときに関連付けられたレコードが表示されないという事実は、メソッドの結果であり、(デフォルトでは)すべての関連付けのデータを表示しません(一般に膨大な量になります)データの)。findinspect

入力Photo.find(51941).appearancesすると、写真ではなく外観の関連付け(配列)が検査されます。そのため、IRBコンソールで結果を確認できます。

それが機能していることをテストしたい場合includeは、最初に写真を変数に割り当てます。

photo = Photo.find(51941, :include => [:people, :appearances])
Photo Load (0.4ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`id` = 51941 LIMIT 1
Appearance Load (0.3ms)  SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position
Person Load (0.2ms)  SELECT `people`.* FROM `people` WHERE `people`.`id` IN (12103)

写真だけでなく、関連する人物や外観についてもSQLステートメントが表示されます。これは、railsがこれらの関連付けに熱心に負荷をかけていることを示しています。

その後、との関連付けを取得し、関連付けがDBからすでにロードされているため、SQLクエリが表示されないphoto.appearances場合:

1.9.3p194 :036 > photo.appearances
=> [#<Appearance id: 73654, photo_id: 51941, person_id: 12103, created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 07:33:24", position: 1>] 

を使用していなかった場合はinclude、結果の前にSQLクエリが表示されます。

1.9.3p194 :036 > photo.appearances
Appearance Load (0.3ms)  SELECT `appearances`.* FROM `appearances` WHERE `appearances`.`photo_id` IN (51941) ORDER BY position
=> [#<Appearance id: 73654, photo_id: 51941, person_id: 12103, created_at: "2011-01-20 07:33:24", updated_at: "2011-01-20 07:33:24", position: 1>] 
于 2012-09-03T02:36:55.427 に答える