2010-04-21 11 views
1

我有一個ActiveRecord對象調用Foo紅寶石:動態調用可用的方法提高未定義的方法(元編程)

Foo.attribute_names.each do |attribute| 
    puts Foo.find(:all)[0].method(attribute.to_sym).call 
end 

在這裏,我呼籲這個模型中的所有屬性(即,查詢每個列的值)。 但是,有時候,我會得到一個未定義的方法錯誤。

ActiveRecord :: Base#attribute_names如何返回一個屬性名稱,該屬性名稱在轉換爲自己的方法調用時會引發未定義的方法錯誤?

請記住,這隻發生在某些對象只有某些方法。我無法識別一種模式。

謝謝。

+1

我無法從您發佈的代碼中判斷出來,但是您可能要查看失敗的'attribute.to_sym'是什麼。此外,您可能已經知道這一點,但是'Foo.find(:all)[0]'是非常低效的 - 使用'Foo.first'來代替。 – igul222 2010-04-21 23:33:41

+0

attribute.to_sym將屬性名稱轉換爲一個字符串(例如'author'爲符號'author')。符號是Object#方法函數接受的數據類型,原則上這隻適用於某些方法 此外,我知道數據庫查詢是可怕的,這不是我實際使用,它只是更容易讓其他人瞭解。 – user94154 2010-04-21 23:40:53

回答

2

NoMethodError應告訴你哪個對象不存在哪種方法。您的find是否有可能沒有記錄?在這種情況下,[][0]nil,您肯定會得到NoMethodError

我會用.fetch(0),而不是[0],你會得到一個KeyError如果曾經有與指數沒有元素0

注:無需to_sym;所有內置方法都接受名稱方法作爲字符串或符號(在1.8和1.9中都有)

+0

不要擔心查詢,它不會返回零結果。並感謝.to_sym提示。 – user94154 2010-04-22 01:54:23

0

也許與訪問有關?就像一個班有attr_protected屬性,或者沿着那條線。或者對於非數據庫列的屬性(沒有定義訪問者)?

+0

所有觸發錯誤的屬性是數據庫列。 – user94154 2010-04-22 01:48:19

相關問題