Rails发现混乱

时间:2010-06-30 08:53:22

标签: ruby-on-rails activerecord

请帮助我获得包含权。

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谢谢!

3 个答案:

答案 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_rankingaward提供相同的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}])