1

初期化されていない関連付けを持つ ActiveRecord オブジェクトを返す単純な結合クエリがあり、その理由を理解しようとしています。(私のセットアップ:MySQLを使用したレール2.3.8)

ここに私のモデルがあります:

class Member
has_many :twitter_status_relations
 //has some more unrelated associations
end

class TwitterStatus
  has_many :twitter_status_relations 
end

class TwitterStatusRelation
 belongs_to :member
 belongs_to :twitter_status
end

そして、ここに私が実行するクエリがあります:

 result = TwitterStatusRelation.all(:joins => :twitter_status, 
:conditions=>{:twitter_statuses=>{:sent_at=>1.month.ago..DateTime.now}}, :include=>:member,:group=>"twitter_status_relations.member_id")

これで、アプリで初めて実行すると、正常に動作します。

print result[0].member, result[0].member.class.reflect_on_all_associations(:has_many)
#=> <Member...>, [<ActiveRecord::Reflection::AssociationReflection,...]

しかし、もう一度実行してメンバーの関連付けにアクセスしようとすると、nil 例外が発生します。印刷すると次のように表示されます。

print result[0].member, result[0].member.class.reflect_on_all_associations(:has_many)
#=> <Member...>, [-- empty ---]

メンバー オブジェクトには関連付けがないように見えるため、いずれかにアクセスしようとすると例外が発生します。

場合によっては、ActiveRecord が返されたオブジェクトの関連付けを初期化しない理由がわかりますか? 私は立ち往生しているので、半分のアイデアをいただければ幸いです。

4

1 に答える 1

0

上記のクエリが生成するSQLは次のとおりです(Ranが私に代わって質問を投稿しました)。SQLにはクエリよりも多くのフィールドがあります。これは、クエリを投稿するときにクエリを簡略化して、問題に関係のない条件を削除したためです。

SELECT `twitter_status_relations`.`id` AS t0_r0,

twitter_status_relationstwitter_status_idAS t0_r1 、 twitter_status_relationssource_twitter_identity_idAS t0_r2 、 twitter_status_relationsrelation_typeAS t0_r3 、 twitter_status_relationsrelation_dataAS t0_r4 、 twitter_status_relationslinked_twitter_identity_idAS t0_r5 、 twitter_status_relationsuser_idAS t0_r6 、 twitter_status_relationslinked_member_idAS t0_r7 、membersid AS t1_r0 、membersuser_idAS t1_r1 、membersnameAS t1_r2 、 membersemailAS t1_r3 、membersmember_ratingAS t1_r4 、 memberscreated_atAS t1_r5 、membersupdated_atAS t1_r6 、 membersmerged_with_member_idAS t1_r7 、membersengage_rating AS t1_r8 、memberssupport_ratingAS t1_r9 、 membersuser_engage_ratingAS t1_r10 、 membersuser_support_ratingAS t1_r11 、 membersinfluence_ratingAS t1_r12 、memberstwitter_username AS t1_r13 、memberslead_ratingAS t1_r14 、 membersfollow_ratingAS t1_r15 、membersunfollow_ratingAS t1_r16 、membersfollowers_countAS t1_r17 、membershiddenAS t1_r18 FROM twitter_status_relationsLEFT OUTER JOIN membersON members.id = .linked_member_id twitter_status_relationsWHERE(twitter_status_relationsuser_id= 1 AND .IN ('mention'、'reply'、'received_dm'、'retweet'、'link'、'term'、'hashtag')AND .IN(83995,128457,21421,138316,128455,97475,128453,436231,82236,441208,138564,138337,436223,436222,441093,21194,441088,441092,438998,442752,138331,138327,138325,444897 、9277,12,509521,13,15,534511,7606,7447,200,7,4,17200,5,652302,1,5536,18770,652301,214082,150870,436228,81204,436225,662513,138608 、138338))ANDtwitter_status_relationsrelation_typetwitter_status_relationslinked_member_idtwitter_status_relations.id IN(8304、26493、113492、113638、1、6、41213、113493、20、26173)GROUP BY twitter_status_relations.linked_member_id ORDER BY members.member_rating

于 2011-08-16T17:04:31.450 に答える