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') }
我猜你忽略了警告说你覆盖了一个现有的方法,结果你就这样了:)
选择另一个状态名称或范围名称。
我的部分应用程序目录设置如下所示:
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') }
我猜你忽略了警告说你覆盖了一个现有的方法,结果你就这样了:)
选择另一个状态名称或范围名称。