2012-06-02 3 views
0

명명 된 범위를 통해 조인에 param을 바인딩하려고하는데 오류가 발생합니다.컨트롤러에서 모델 조건으로 매개 변수를 전달하십시오.

올바른 방법은 무엇입니까?

Idea.with_vote(request.ip).all

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 

나는 그것이 ON 절에 나타날 때까지 나는 하나보다는, 가입 모델의 조건 정의를 필요로 생각합니다.


편집는 나는 당신이 관련 불완전한 조건을 사용할 수 있다고 생각하지 않습니다 다음 쿼리

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

답변

1

을 얻기 위해 노력하고있어. 정확하게 이해한다면 Idea는 많은 득표와 투표 기록을 가지고 request.ip와 아이디어 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? 당신의 깃발이 될 것입니다 :) –

관련 문제