Model.new 返回 Mongoid::Criteria 而不是模型实例

Model.new is returning a Mongoid::Criteria instead of a Model instance

我的部分应用程序目录设置如下所示:

app
  models
    tasks
      email_task.rb
      signup_task.rb
      task.rb

task.rb 包含:

class Task
  include Mongoid::Document
  include Mongoid::Timestamps

  VALID_STATUSES = %w{ new pending complete }

  field :status, type: String, default: 'new'

  # Scopes
  VALID_STATUSES.each do |status|
    scope status.to_sym, -> { where(status: status) }

    define_method "#{status}?" do
      self.status == status
    end
  end
end

signup_task.rb 包含:

class SignupTask < Task
end

在 rails 控制台中,当我执行 SignupTask.new 时,我希望它成为 return SignupTask 模型的一个实例。也许是这样的:

irb(main):027:0> SignupTask.new
=> #<SignupTask _id: 557552b74372615e3b010000, created_at: .....>

但是,它 return 是 Mongoid::Criteria:

irb(main):027:0> SignupTask.new
=> #<Mongoid::Criteria
  selector: {"status"=>"new"}
  options:  {}
  class:    SignupTask
  embedded: false>

我注意到注释掉 # Scopes 部分可以解决问题,但为什么这首先会改变行为?

new 是您状态的一部分。

您在元编程循环中创建了 new 作用域。

scope status.to_sym, -> { where(status: status) }

# => scope :new, -> { where(status: 'new') }

我猜你忽略了警告说你覆盖了一个现有的方法,结果你就这样了:)

选择另一个状态名称或范围名称。