2011-01-21 13 views
4

私は項目ActiveRecordsを持っており、ブロックごとにデフォルト値( "テスト項目")を設定しようとしています。この式で
:値が設定されていない属性の設定に問題があります

list = {"type1", "type2", "type3", "type4", "..."} 
list.each { |name| @item.attributes["#{name}"] = "Test item"] } 

。私はすべての項目のためにこれを行うことができないため

私は補間に@item.attributes["#{name}"]を使用する必要があります。

@item.tipe1 = "Test item" 

だから、何が最初の文になりますか?どうして?私がしたいことがそのようには不可能なら、私は同じことをどうやってやることができますか?

答えて

2

割り当て@items.attributes["#{name}"] = "Test item"]、動作しません。だからあなたは思った通りに@items 'オブジェクトの値を変更していません。代わりに、返された新しいハッシュの値を変更しています。そして、このハッシュは各反復の後で失われます(もちろん、eachブロックが終了したとき)。

可能な解決策は、@items 'のキーで新しいハッシュを作成し、これをattributes=メソッドで割り当てることです。

h = Hash.new 

# this creates a new hash object based on @items.attributes 
# with all values set to "Test Item" 
@items.attributes.each { |key, value| h[key] = "Test Item" } 

@items.attributes = h 
1

私は問題は、ActiveRecordオブジェクトではなく返される属性ハッシュだけを変更していることだと思います。あなたが好きな何かをする必要が

:あなたの例に続き

# make hash h 
@items.attributes = h 

は、おそらくのようなもの:

@items.attributes = %w{type1 type2 type3 type4}.inject({}) { |m, e| m[e] = 'Test item'; m } 

はところで、"#{e}"は、文字列式eとして、あるいは任意のタイプのために同じものである:e.to_s 。第二の例は、おそらく読みやすくするために:あなたはDanneManne's提案を取り、送信使うことができ、完全に生成された属性について

@items.attributes = { :field => 'value', :anotherfield => 'value' } 

a = %w{type1 type2 type3 type4} 
h = {} 
a.each { |name| h[name] = 'test item' } 
@items.attributes = h 

attributes=メソッドを使用して、おそらく同様に、ハッシュ定数を対象としています。

+0

私はあなたの応答が最高だ​​と思うが、彼の説明でダニエルは私のトラブルについてより簡単に理解できるようにした。 – user502052

2

この目的でsendメソッドを使用できます。おそらく、このように:attributes方法は、新しいハッシュオブジェクトにあなたがそれを呼び出すたびに返すため

list = {"type1", "type2", "type3", "type4", "..."} 
list.each { |name| @item.send("#{name}=", "Test item") } 
関連する問題