我正在尝试通过命名范围将param绑定到连接。但是我收到了错误。
这样做的正确方法是什么?
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}
答案 0 :(得分: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
应该有用。