0

この状況で何が起こっているのか、誰にも分かりますか? なぜ使用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.classMyModel

  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

編集: スコープの解決が必要になる理由についての質問を明確化/追加します。

この質問はかなり似ていますが、スコープ解決なしで使用してもほとんどの場合うまくいく理由はまだ不明です。MyModel

4

1 に答える 1

5

Ruby が名前空間内を検索しないように、スコープ解決演算子を使用する必要があります。MyModelMyModel

def custom_validation
  if ::MyModel.where(some_field: 1).count > 0
    errors.add(:some_field, "foo")
  end
end
于 2013-05-22T03:10:23.380 に答える