我在其他控制器中调用ReleaseSchedule.next_release
并收到以下错误
NoMethodError (undefined method `to_criteria' for #<ReleaseSchedule:0x007f9cfafbfe70>):
app/controllers/weekly_query_controller.rb:15:in `next_release'
class ReleaseSchedule
scope :next_release, ->(){ ReleaseSchedule.where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first }
end
答案 0 :(得分:1)
这根本不是一个范围,这只是一个看起来像范围的类方法。有两个问题:
ReleaseSchedule.where(...)
,因此您无法将“范围”链接起来(即ReleaseSchedule.where(...).next_release
将无法执行预期的操作。)first
结尾,因此它不会返回查询,只返回单个实例。2 可能是您的NoMethodError来自的地方。
如果您因某种原因确实希望它成为范围,那么您会说:
# No `first` or explicit class reference in here.
scope :next_release, -> { where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at) }
并将其用作:
# The `first` goes here instead.
r = ReleaseSchedule.next_release.first
但实际上,你只需要一个类方法:
def self.next_release
where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first
end
毕竟,scope
宏只是构建类方法的一种奇特方式。我们scope
的唯一原因是表达意图(即逐个构建查询),而您正在做的事情与该意图不符。