任何人都知道在这种情况下可能会发生什么?为什么需要使用self.class
或范围解析::MyModel
?
class MyModel < ActiveRecord::Base
belongs_to :other_model
validate :custom_validation
private
def custom_validation
if MyModel.where(some_field: 1).count > 0
errors.add(:some_field, "foo")
end
end
end
# ... In some other part of the code base
my_model_instance = @other_model.my_models.find_or_initialize_by_some_field("foo")
my_model_instance.save
# Raises error - MyModel::MyModel is undefined
以上代码大部分时间都可以正常运行。但出于某种原因,在一种情况下它抛出了这个例外。将custom_validation
函数更改为使用self.class
而不是MyModel
,它可以正常工作。
def custom_validation
if self.class.where(some_field: "bar").count > 0
errors.add(:some_field, "error message")
end
end
以前有人见过这样的事吗?为什么/如何将常量MyModel
解释为MyModel::MyModel
是这种特定情况?
Ruby 2.0.0-p195
和Rails 3.2.13
编辑: 澄清/添加有关为何需要范围解析的问题。
This question非常相似,但我仍然不清楚为什么在没有范围解析的情况下使用MyModel
可以正常 。< / p>
答案 0 :(得分:5)
您需要使用scope resolution operator,因此Ruby不会在MyModel
命名空间中查找MyModel
。
def custom_validation
if ::MyModel.where(some_field: 1).count > 0
errors.add(:some_field, "foo")
end
end