范围不适用于Mongoid(未定义方法`to_criteria')

时间:2015-01-17 03:14:08

标签: ruby-on-rails-4 mongoid mongoid4

我在其他控制器中调用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

1 个答案:

答案 0 :(得分:1)

这根本不是一个范围,这只是一个看起来像范围的类方法。有两个问题:

  1. 您说的是ReleaseSchedule.where(...),因此您无法将“范围”链接起来(即ReleaseSchedule.where(...).next_release将无法执行预期的操作。)
  2. 您的“范围”以first结尾,因此它不会返回查询,只返回单个实例。
  3. 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的唯一原因是表达意图(即逐个构建查询),而您正在做的事情与该意图不符。