Article と Category という 2 つのモデルがある簡単な例を考えてみましょう。
class Article < ActiveRecord::Base
belongs_to :category
def self.search(title)
where(:title => title)
end
end
class Category < ActiveRecord::Base
has_many :articles
end
さて、レールコンソールで:
Article.all.search('test article')
予想通り、エラーを返します
NoMethodError: undefined method `search' for #<Array:0x9aa207c>
しかし、私がこれを行うとき
Category.first.articles.search('test article')
一連のレコードを返します!
これにより、クラスのチェックが促されます
Article.all
と
Category.first.articles
どちらもArrayクラスを返します。
明らかに、Article のクラス メソッド 'search' は実行時に導入され、関連付け (Category) を介してアクセスされた場合はレコードの「正しい」戻りを促しますが、クラス自体 (Article) によってアクセスされた場合は別の動作をします。
それで、何が起こっているのですか?