将参数从控制器传递到模型条件

时间:2012-06-02 16:13:07

标签: ruby-on-rails activerecord

我正在尝试通过命名范围将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}

1 个答案:

答案 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应该有用。