2010-07-19 69 views
1

找到我的产品型号是这样的:的ActiveRecord通过HAS_ONE关联子属性

class Discussion < ActiveRecord::Base 
    has_many :comments 
    has_one :special_comment, :class_name => "Comment" 
end 

class Comment < ActiveRecord::Base 
    belongs_to :discussion 
    # contains author 
end 

我如何通过其邻接:special_comment“作者”联想选择每Discussion。有效地我想要做的事,如:

select * from discussions 
inner join comments on comments.discussion_id=discussion.id 
where comments.author = 'poopface' 

我得到的东西接近这个:

Discussion.find(:全部:条件=> {:作者=> 'poopface'} ,:joins =>:special_comment) ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:no such column:discussions.author:SELECT“discussions”。* FROM“discussion”INNER JOIN“comments”ON comments.discussion_id = discussions.id WHERE(“讨论”,“作者”='poopface')

但应WHERE ("comments"."author" = 'poopface')

谢谢!

+0

has_one用于识别'special_comment'而不是其他评论?使用has_one而不是belongs_to,其中您的外键位于另一个对象上。这是你的情况吗? – 2010-07-20 03:07:57

回答

0

假设你有你的意见表中的一些外键,你的HAS_ONE被引用...

Discussion.find(:all, :conditions => {:comments=>{:author => 'blah'}}, 
        :joins => :special_comment) 

会给你在哪里special_comment由“嗒嗒”创作的所有讨论。

Discussion.find(:all, :conditions => {:comments=>{:author => 'blah'}}, 
        :joins => :comments) 

将给你所有的讨论,他们有什么评论,由'blah'撰写。

+0

这会引发SQL错误。散列键“special_comment”被'find'调用用作讨论表的表别名。 “讨论”表的表别名是“讨论”。对条件使用嵌套哈希时,这是一个已知的限制。 – 2010-07-19 23:34:26

+0

公平点..它应该是'评论'然后.. special_comment是一个参考评论而不是讨论。 - 我相信。 – 2010-07-20 03:00:12

+0

你说得对,'special_comment'指'comments'。 – 2010-07-20 04:08:45

2

试试这个:

Discussion.all(:conditions => {:comments=> {:author => "blah"}}, 
      :joins => :comments) 

OR

Discussion.all(:conditions => ["comments.author = ?", "blah"], 
      :joins => :comments) 

注:可能是你可以在你的示例代码中使用了一个更好的作者姓名。

+0

修复错误后更新了答案。 – 2010-07-20 04:06:52