從模型中獲取所有值後,我想向ActiveRecord類添加另一個自定義屬性(該屬性不是db中的列),以便我可以在視圖中使用它,但是rails會不允許我添加一個。我應該在模型類中添加什麼?如何向ActiveRecord添加新屬性
@test.all
@test.each do |elm|
elm[:newatt] = 'added string'
end
錯誤:
can't write unknown attribute `newatt'
從模型中獲取所有值後,我想向ActiveRecord類添加另一個自定義屬性(該屬性不是db中的列),以便我可以在視圖中使用它,但是rails會不允許我添加一個。我應該在模型類中添加什麼?如何向ActiveRecord添加新屬性
@test.all
@test.each do |elm|
elm[:newatt] = 'added string'
end
錯誤:
can't write unknown attribute `newatt'
試試這個
class Test < ActiveRecord::Base
attr_accessor :newattr
end
你可以像
訪問@test = Test.new
@test.newattr = "value"
正如你可能會注意到這是一個屬性,而不是散列。所以它使用.
語法。但是,如果你需要它表現得像一個哈希,你可以做到這一點沒有定義一個新的屬性
@test.all
@test.each do |elm|
new_elm = {}
new_elm[:newatt] = 'added string'
end
最後,我不完全知道你正在嘗試做的。如果這對你沒有意義,請重新修改你的問題,以便我們更好地理解問題。
我想你的意思是指定@test到ActiveRecord查詢,是否正確?嘗試:
@test = MyARClass.select("*, NULL as newatt")
@test.each {|t| t[:newatt] = some_value}
另一個相關的解決方案是讓一個單獨的類方法,但你不得不跳,雖然多個環,使其可寫,我直觀地感受到這樣可能會帶來更多的開銷
@test = MyARClass.all
@test.each do t
def t.newatt
some_value
end
end
使用第二種方法,當然你可以通過@ test.first.newatt而不是@ test.first [:newatt]來訪問它。你可以嘗試重新定義t。[]和t。[] =,但是這開始變得非常混亂。
如果它真的只是暫時並不一定要在對象:
@test.all
@test_temp = []
@test.each do |elm|
@test_temp << {:elm => elm, :newatt => 'added string'}
end
否則,也good answers here的。
如果你想這只是你的意見,並沒有任何其他目的,那麼你不需要在這裏你所添加的ActiveRecord的查詢輸出與值newattr屬性添加attr_accessor
@test.all.select('tests.*, "added string" as newattr')
「添加字符串'
@test.all
@test.each do |elm|
write_attribute(:newatt, "added string")
end
我遇到了同樣的問題。併成功繞過使用instance_eval
@test.all
@test.each do |elm|
elm.instance_eval { @newatt = 'added string' }
end
通常它不會遇到問題,當使用attr_accessor。當其他DSL重寫「newattr =」時會出現這個問題。在我的情況下,它是錢軌「貨幣化:newatt」
顯式使用write_attribute不起作用,因爲它是在rails 4中引發異常的原因。x
你想用它做什麼?只有一個範圍,或者你想這樣保存到數據庫? – Mindbreaker
我不想將它保存到數據庫。我正在做一些處理(請參閱更新的代碼),並且我想爲每個元素添加一些額外的信息。它只會在視圖中使用。 – Ladiko
[將額外的運行時attribs添加到activerecord對象]可能的重複(http://stackoverflow.com/questions/7584592/adding-extra-run-time-attribs-to-an-activerecord-object) – mlt