2010-06-30 106 views
0

请帮我弄清楚include的权利。Rails发现混淆

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

更新我的帖子,请参见下文。 – dombesz 2010-06-30 11:15:25

回答

0

您的问题是:

has_one :overall_ranking, :foreign_key => :poem_id 

意味着奖有一个OverallRanking和奖的HAS_ONE关系ID是列poem_id,即你的逻辑是错误的。

它将使更多的意义,如果你只想用:

@award.poem.overall_rating 

或者在发现:

Award.all(:include => [:poem => {:overall_ranking}]) 
+0

请参阅编辑,我不能依靠诗#编号 – user334626 2010-06-30 10:14:15

+0

嗯。然后你可以指定:primary_key选项,它将告诉Rails你想用于关系的Award的属性。例如:has_one:overall_ranking,:foreign_key =>:poem_id,:primary_key =>:poem_id – 2010-06-30 11:22:24

+0

就是这样,谢谢:D – user334626 2010-06-30 13:17:04

0

你可能想给一些更多的信息,但我希望这有助于:

你可能想尝试joins

例如:

Award.all(:joins => :overall_ranking, :conditions => ['some_attribute_from_overall_ranking=?', true]) 

因此,这将发现奖和include的overall_ranking。

+0

在Award.all中,我需要poem_id来记录它加入的记录。我不知道该怎么做。 – user334626 2010-06-30 09:26:18

+0

Award.all(:joins =>:overall_ranking,:conditions => [“poem_id =?”,self.poem_id])??? – user334626 2010-06-30 09:28:30

+0

Award.all(:joins =>“LEFT JOIN'overall_rankings' ON awards.poem_id = overall_rankings.poem_id”)??? – user334626 2010-06-30 09:35:54

0

对我来说有些困惑。

Award 
    belongs_to :poem 
    has_one :overall_ranking, :foreign_key => :poem_id 

在这里,两个关系使用相同的ID。这意味着您尝试使用诗ID检索整体排名。 如果我转换到SQL你这样说:

overall_ranking.id = poem_id 

我认为这是错误的。

如果你喜欢有award相同overall_rankingpoem你可以写这样的事情:

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 

你总是应该有belongs_to的在您存储参考ID模型。 2.但这不能解决您的逻辑问题。 有了这个,你仍然会有Award#poem_id = OverallRanking#id之间的联系。你应该有Award#poem_id = OverallRanking#poem_id

我建议添加overall_ranking_idAward,事情变得更加清洁。

+0

请参阅上面的编辑。我不能依赖Poem#id,因为Award是使用poem_id的单独副本。如果用户删除了该诗,奖励将被复制(因此我可以保持该奖项可见)。谢谢 – user334626 2010-06-30 10:05:22