2013-08-25 84 views
6

從模型中獲取所有值後,我想向ActiveRecord類添加另一個自定義屬性(該屬性不是db中的列),以便我可以在視圖中使用它,但是rails會不允許我添加一個。我應該在模型類中添加什麼?如何向ActiveRecord添加新屬性

@test.all 

@test.each do |elm| 
    elm[:newatt] = 'added string' 
end 

錯誤:

can't write unknown attribute `newatt' 
+0

你想用它做什麼?只有一個範圍,或者你想這樣保存到數據庫? – Mindbreaker

+0

我不想將它保存到數據庫。我正在做一些處理(請參閱更新的代碼),並且我想爲每個元素添加一些額外的信息。它只會在視圖中使用。 – Ladiko

+0

[將額外的運行時attribs添加到activerecord對象]可能的重複(http://stackoverflow.com/questions/7584592/adding-extra-run-time-attribs-to-an-activerecord-object) – mlt

回答

4

定義虛擬屬性爲實例變量:

attr_accessor :newattr 
+0

沒有工作,請參閱更新的代碼。 – Ladiko

+2

'elm.newatt ='added string'' –

+0

請按照Jesse在他的評論中指出的那樣做 – boulder

8

試試這個

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 

最後,我不完全知道你正在嘗試做的。如果這對你沒有意義,請重新修改你的問題,以便我們更好地理解問題。

2

我想你的意思是指定@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。[] =,但是這開始變得非常混亂。

2

如果它真的只是暫時並不一定要在對象:

@test.all 
@test_temp = [] 

@test.each do |elm| 
    @test_temp << {:elm => elm, :newatt => 'added string'} 
end 

否則,也good answers here的。

3

如果你想這只是你的意見,並沒有任何其他目的,那麼你不需要在這裏你所添加的ActiveRecord的查詢輸出與值newattr屬性添加attr_accessor

@test.all.select('tests.*, "added string" as newattr') 

「添加字符串'

1
@test.all 

@test.each do |elm| 
    write_attribute(:newatt, "added string") 
end 
0

我遇到了同樣的問題。併成功繞過使用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