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

モデルの条件定義が、 WHEREではなく、 JOINのON句に表示されるようにする必要があると思います。


編集私は次のクエリを取得しようとしています

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

1 に答える 1

1

アソシエーションで不完全な条件を使用できるとは思いません。私が正しく理解している場合は、Ideaに多くの票があり、票がrequest.ipとideaidを記録している必要があります。スコープで、現在のリクエスト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は動作するはずです。

于 2012-06-02T16:32:51.573 に答える