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

我相信我需要模型中的条件定义才能出现在JOIN的ON子句中,而不是出现在WHERE 子句中。


编辑我正在尝试获取以下查询

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和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应该可以工作了。

于 2012-06-02T16:32:51.573 回答