请帮助我获得包含权。
Poem
has_many :awards
has_one :overall_ranking
Award
belongs_to :poem
# before
# has_one :overall_ranking, :foreign_key => :poem_id
## SOLUTION
# after
has_one :overall_ranking, :foreign_key => :poem_id, :primary_key => :poem_id
OverallRanking
belongs_to :poem
update: Award.all(:include => [:overall_ranking]) # works with SOLUTION
请注意,我不能依赖Poem#id
因为用户可能会删除这首诗,但如果它是胜利者,我会在Award
内制作一份副本,因此我必须仅依赖于Award#poem_id
谢谢!
答案 0 :(得分:0)
您可能希望提供更多信息,但我希望这会有所帮助:
您可能想尝试joins
。
例如:
Award.all(:joins => :overall_ranking, :conditions => ['some_attribute_from_overall_ranking=?', true])
因此,这将获得奖励和include
overall_ranking。
答案 1 :(得分:0)
对我来说有些困惑。
Award
belongs_to :poem
has_one :overall_ranking, :foreign_key => :poem_id
这两个关系使用相同的ID。这意味着您尝试使用诗歌ID检索整体排名。 如果我翻译成sql,你会说:
overall_ranking.id = poem_id
我认为这是错误的。
如果您想为overall_ranking
和award
提供相同的poem
,可以这样写:
Award.rb
belongs_to :poem
has_one :overall_ranking, :through=>:poem
您可以包含
Award.all(:include => [:overall_ranking])
or nested
Award.all(:include => [{:poem=>:overall_ranking}])
<强>更新强>
1.您的一个关联设置不正确。
请参阅:http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality
Award
belongs_to :poem
belongs_to :overall_ranking, :foreign_key => :poem_id
OverallRanking
belongs_to :poem
has_one :award
您应始终在存储引用ID的模型中使用belongs_to。
但这并不能解决你的逻辑问题。
有了这个,你仍然会在Award#poem_id = OverallRanking#id
之间建立关联。你应该有Award#poem_id = OverallRanking#poem_id
。
我建议将overall_ranking_id
添加到Award
,事情会变得更加清晰。
答案 2 :(得分:0)
你的问题是:
has_one :overall_ranking, :foreign_key => :poem_id
表示Award有一个OverallRanking,并且has_one关系中的Award ID在列poem_id中,即您的逻辑错误。
如果您只使用以下内容会更有意义:
@award.poem.overall_rating
或者在找到:
Award.all(:include => [:poem => {:overall_ranking}])