2012-06-02 81 views
0

我試圖通過命名作用域將連接綁定到連接,但是出現錯誤。從控制器傳遞參數到模型條件

這樣做的正確方法是什麼?

class Idea < ActiveRecord::Base 

    #relations 
    has_many :votes, :inverse_of => :idea 
    has_one :has_voted, :class_name => 'Vote', :conditions => ['ip = :ip'] 

    # named scopes 
    scope :with_vote, lambda {|ip| { 
     :include => [:has_voted], 
     # like this ?? 
     :conditions => [:has_voted => {:conditions => {:userIp => ip}} ] 
    }} 

end 

Idea.with_vote(request.ip).all

我相信我需要在模型中的條件定義爲它出現ON子句中JOIN,而不是在WHERE之一。


編輯我試圖讓下面的查詢

select Ideas.*, Votes.* from Ideas 
left outer join Votes 
on Votes.Idea_id = Idea.id AND Votes.ip = {request.ip} 

回答

1

我不認爲你可以在關聯使用不完整的情況。 如果我理解正確,你需要Idea有很多票和票,記錄request.ip和idea id。 您希望範圍檢索您當前請求ip投票的所有提示。

class Idea 
    has_many :votes 

    scope :with_vote_from_ip, lambda {|ip| { 
    :include => [:votes], 
    :conditions => ['votes.ip = ?', ip] 
    }} 
end 

但是如果你想要所有的想法只包括來自當前的投票,你需要額外的外部連接條件。我認爲這是不可能沒有SQL片段:

class Idea 
    has_many :votes 

    scope :with_vote_from_ip, lambda {|ip| { 
    :joins => 'left outer join Votes on Votes.Idea_id = Idea.id AND Votes.ip = #{ip}' 
    }} 
end 

現在Idea.with_vote_from_ip(request.ip).all應該工作。

+0

我想**所有**的想法和一個標誌,指示當前用戶是否投了票。 – Alex

+0

在這種情況下,我收到以下查詢: 'SELECT ... FROM「ideas」LEFT OUTER JOIN「ideas_votes」ON「ideas_votes」。「idea_id」=「ideas」。「id」WHERE(votes.ip = '127.0.0.1')' 和ip出現在哪裏,而不是** ON **子句 – Alex

+1

看到我的更新,現在是idea.votes.empty?將是你的國旗:) –

相關問題