2010-03-20 101 views
2

我想在ActiveRecord取景器中爲:include選項生成的LEFT OUTER JOIN添加附加條件。如何將附加條件添加到由include生成的JOIN?

class Post 
    has_many :comments 
end 

class Comment 
    belongs_to :post 
    has_many :comment_votes 
end 

class CommentVote 
    belongs_to :comment 
end 

現在讓我們說我想找到最後10個職位與他們相關的評論和最多的投票。

Post.find.all(:limit => 10, :order => "created_at DESC", 
    :include => [{:comments => :comment_votes]) 

我無法添加條件來檢查最後的投票,因爲它會忽略沒有投票的帖子。因此,條件必須轉到爲comment_votes生成的JOIN的ON子句。我希望得到如下語法:

Post.find.all(:limit => 10, :order => "created_at DESC", 
    :include => [{:comments => [:comment_votes, :on => "comment_votes.vote > 0"]) 

你以前遇到過這樣的問題嗎?您是否設法使用當前查找器解決問題?我希望聽到來自社區的一些有趣的想法。

PS:我可以編寫連接SQL來獲得預期的結果並將結果拼接在一起。我想確保在沿着這條道路前沒有別的選擇。

回答

3

如果我正確地按照你的問題,這樣的事情可能工作:

class Comment 
    belongs_to :post 
    has_many :comment_votes 
    has_many :up_votes, :class_name => "CommentVote", :conditions => "vote > 0" 
end 

那麼你的取景器將是:

Post.find.all(:limit => 10, :order => "created_at DESC", 
:include => {:comments => :up_votes}) 

注:我沒有測試這一點。

相關問題