Model.new返回一个Mongoid :: Criteria而不是Model实例

时间:2015-06-08 08:51:23

标签: ruby-on-rails mongoid

我的app目录设置的一部分如下:

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时,我希望它返回一个SignupTask模型的实例。也许是这样的:

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

但相反,它返回一个Mongoid :: Criteria:

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

我注意到# Scopes部分的注释会解决问题,但为什么会在一开始就改变行为?

1 个答案:

答案 0 :(得分:2)

new是您身份的一部分。

您可以在元编程循环中创建new范围。

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

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

我猜你忽略了警告,说你覆盖了一个现有的方法,最后你就完成了:)

选择其他状态名称或范围名称。