我正在尝试查询使用联接的数据库来查找需要警报的用户。我的查询在为其编写的模型中工作正常,并且当传递的参数是显式时,它也可以在范围内工作。但是,当我将参数作为变量传递时,它不起作用。这是我的代码:
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)
没关系。感谢帮助。
答案 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) }