2012-06-02 3 views
0

Я пытаюсь связать параметр с соединением через именованный scope., Но я получаю сообщение об ошибке.передать параметр из состояния контроллера в состояние

Каков правильный способ сделать это?

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 пунктом в РЕГИСТРИРУЙТЕСЬ, а затем в WHERE один.


Редактировать Я пытаюсь получить следующий запрос

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

ответ

1

Я не думаю, что вы можете использовать неполные условия в ассоциации. Если я правильно понимаю, вам нужна идея, у которой много голосов и голосов записывает идентификатор request.ip и idea. Вы хотите, чтобы область охватила все идеи, за которые проголосовал ваш текущий запрос 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" идеи "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? будет вашим флагом :) –

Смежные вопросы