我的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
部分的注释会解决问题,但为什么会在一开始就改变行为?
答案 0 :(得分:2)
new
是您身份的一部分。
您可以在元编程循环中创建new
范围。
scope status.to_sym, -> { where(status: status) }
# => scope :new, -> { where(status: 'new') }
我猜你忽略了警告,说你覆盖了一个现有的方法,最后你就完成了:)
选择其他状态名称或范围名称。