2

考慮一個簡單的例子,我們有2個模型,文章和類別。爲什麼/只有通過Rails 3中的關聯才能訪問一個記錄數組的類方法?

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 

都返回陣列類。

顯然,文章的類方法'搜索'正在運行時引入,並通過其關聯(類別)訪問時提示「正確」返回記錄,但在類自身(文章)訪問時會有其他行爲。

那麼,發生了什麼?

回答

2

這是因爲當您執行.all查詢實際上是執行的,所以返回的對象將是一個基本數組。但是,當您執行Category.first時,它將返回一個Category對象,然後articles實際上正在使用ActiveRecord::Reflection::AssociationReflection並對Array進行擴展。例如,在rails c嘗試:

Category.first.articles.ancestors 

VS

Category.first.articles.all.ancestors #throws an error 

第二種引發錯誤,因爲在該點的對象僅僅是一個簡單的陣列。第一,但是,是由這樣的:

Article(...), ActiveRecord::Base, ActiveRecord::Reflection, Object (and so on) 

再舉一個例子,試試這個:

a = Category.first.articles; ObjectSpace.each_object(Class).select {|k| a < k } 
#=> [Object, BasicObject, ActiveRecord::Base] 

你可以看到,雖然它看起來像一個數組,它繼承的其他類。

+0

啊!懶惰加載。謝謝 ! – Shreyas 2011-03-30 04:13:24

0
Article.all 

這將返回傳給你的錯誤,你所看到的,你要在Array類運行的Article類功能的陣列。

我不知道你要完成什麼,但你可以做到這一點,我認爲

Article.search("soem content") 

但是,我不知道是否會返回一個結果,因爲它可能只是返回一個

+0

對不起@nvez,但這不​​是我正在尋找的答案。我很清楚自己想要完成什麼,我只是很好奇爲什麼或如何發佈。 – Shreyas 2011-03-29 18:02:35

相關問題