2013-08-25 13 views
6

モデルからすべての値を取得した後、ビューで使用できるようにActiveRecordクラスに別のカスタム属性を追加したい(この属性はdbの列ではありませんが、私は1つを追加することはできません。モデルクラスに何を追加すればよいですか?ActiveRecordに新しい属性を追加する方法

@test.all 

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

エラー:

can't write unknown attribute `newatt' 
+0

あなたはそれをどうしますか?スコープのみ、またはデータベースに保存しますか? – Mindbreaker

+0

私はそれをデータベースに保存したくありません。私はそれぞれ(更新されたコードを参照)でいくつかの処理をしています、そして、私は各要素にいくつかの追加情報を追加したいと思います。ビューでのみ使用されます。 – Ladiko

+0

[アクティブレコードオブジェクトに余分なランタイムアトリビュートを追加する]の可能な複製(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 
を負うように私は直感的に感じるのに他の関連ソリューションは、それシングルトンクラスメソッドにすることです

2番目の方法を使うと、もちろん@ 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"です

明示的に使用すると、レール4で例外が発生するため、動作しません。x

関連する問題