什么时候在Ruby(ActiveRecord)中需要范围解析

时间:2013-05-22 02:57:07

标签: ruby-on-rails ruby activerecord

任何人都知道在这种情况下可能会发生什么?为什么需要使用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-p195Rails 3.2.13

编辑: 澄清/添加有关为何需要范围解析的问题。

This question非常相似,但我仍然不清楚为什么在没有范围解析的情况下使用MyModel可以正常 。< / p>

1 个答案:

答案 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