作用域不适用于 Mongoid(未定义方法 `to_criteria')
scope not working on Mongoid (undefined method `to_criteria')
我在其他控制器中调用ReleaseSchedule.next_release
并得到以下错误
NoMethodError (undefined method `to_criteria' for #<ReleaseSchedule:0x007f9cfafbfe70>):
app/controllers/weekly_query_controller.rb:15:in `next_release'
releae_schedule.rb
class ReleaseSchedule
scope :next_release, ->(){ ReleaseSchedule.where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first }
end
那根本不是一个真正的作用域,它只是一个 class 方法包装起来看起来像一个作用域。有两个问题:
- 你说
ReleaseSchedule.where(...)
所以你不能链接 "scope" (即 ReleaseSchedule.where(...).next_release
不会做它应该做的事)。
- 您的 "scope" 以
first
结尾,因此它不会 return 查询,它只是 return 一个实例。
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
但实际上,您只需要一个 class 方法:
def self.next_release
where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first
end
毕竟,scope
宏只是构建 class 方法的一种奇特方式。我们有 scope
的唯一原因是表达意图(即逐个构建查询)而您正在做的事情与该意图不符。
我在其他控制器中调用ReleaseSchedule.next_release
并得到以下错误
NoMethodError (undefined method `to_criteria' for #<ReleaseSchedule:0x007f9cfafbfe70>):
app/controllers/weekly_query_controller.rb:15:in `next_release'
releae_schedule.rb
class ReleaseSchedule
scope :next_release, ->(){ ReleaseSchedule.where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first }
end
那根本不是一个真正的作用域,它只是一个 class 方法包装起来看起来像一个作用域。有两个问题:
- 你说
ReleaseSchedule.where(...)
所以你不能链接 "scope" (即ReleaseSchedule.where(...).next_release
不会做它应该做的事)。 - 您的 "scope" 以
first
结尾,因此它不会 return 查询,它只是 return 一个实例。
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
但实际上,您只需要一个 class 方法:
def self.next_release
where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first
end
毕竟,scope
宏只是构建 class 方法的一种奇特方式。我们有 scope
的唯一原因是表达意图(即逐个构建查询)而您正在做的事情与该意图不符。