交叉范围参数在Rails 3中传递

时间:2012-02-08 21:34:03

标签: ruby-on-rails ruby-on-rails-3 activerecord scope rails-activerecord

我正在尝试查询使用联接的数据库来查找需要警报的用户。我的查询在为其编写的模型中工作正常,并且当传递的参数是显式时,它也可以在范围内工作。但是,当我将参数作为变量传递时,它不起作用。这是我的代码:

class Alert < ActiveRecord::Base
  belongs_to :user
  attr_accessible :first_alert, :second_alert, :third_alert, :user_id
  def self.find_users_to_alert(time)
    where(:third_alert => time)
  end
  scope :alerter, find_users_to_alert (here is where i want to pass param)
end

class User < ActiveRecord::Base
  has_many :alerts
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation

  scope :alerts_to_be_sent, joins(:alerts) & Alert.alerter
end

我得到的错误是一个NameError未定义的局部变量或方法。但我会想到在rails控制台中传递变量的值,如:

User.alerts_to_be_sent(5)

没关系。感谢帮助。

2 个答案:

答案 0 :(得分:5)

来自Active Record Query Interface Guide

  

使用类方法是接受范围参数的首选方法。仍然可以在关联对象[...]

上访问这些方法

所以改为编写类方法:

class Alert < ActiveRecord::Base
  def self.alerter(t)
    find_users_to_alert(t)
  end
end

def User < ActiveRecord::Base
  def self.alerts_to_be_sent(t)
    joins(:alerts) & Alert.alerter(t)
  end
end

答案 1 :(得分:2)

我认为您正在寻找lambda范围语法

scope :alerter, lambda { |number| find_users_to_alert(number) }
scope :alerts_to_be_sent, lambda { |number| joins(:alerts) & Alert.alerter(number) }