2010-12-08 6 views
1

背景を追加するすべての属性を上書き...instance_variable_set(:@attributes、{:brand.to_s =>「アップル」})が代わりに

私は、文字列を見て、何を決定しようとパーサを書いています製品に含まれる可能性があります。私は自分のTokenクラスを作成しました。

class Token < ActiveRecord::BaseWithoutTable 

    attr_accessor :regex 
    attr_accessor :values 

end 

トークンの例:

Token.new(:regex => /apple iphone 4/, :values => { :brand => "Apple", :product => "iPhone", :version => 4}) 

(ハッシュキーは、すべての製品のテーブルのデータベース列に対応する)

ここでは問題である:私のParserにおいて、場合Tokenが見つかった場合、関連する値をProductインスタンスに追加しようとします。

token.values.each do |v| 
    attrib, value = v[0], v[1] 
    my_product.instance_variable_set(:@attributes, { attrib.to_s => value }) 
end 

これは、すべての属性を同時に設定する必要があるように見えることを除いて、機能します。私がそれを段階的に行うと(つまり、新しいトークンを発見すると)、指定されていない属性はすべてnilで上書きされます。何か不足していますか?これを行うより良い方法はありますか?

+0

は、我々はあなたの 'Product'モデルを見ることができますか? –

+0

'instance_variable_set'を使う特別な理由はありますか、' token.values'が返す 'Hash'の' key'で表される属性を更新したいだけですか? – Swanand

答えて

0

my_productactive_recordオブジェクトである場合は、代わりにinstance_variable_setwrite_attributeを使用することができます。これが唯一の属性、すなわちデータベース列を記述することに注意してください:

また
token.values.each do |v| 
    attrib, value = v[0], v[1] 
    my_product.write_attribute attrib.to_s, value # attrib.to_sym would work too 
end 

token.valuesあれば戻りHashを、これはあなたが繰り返すことができる方法である。

token.values.each do |k, v| 
    my_product.write_attribute k, v 
end 
1

(存在する場合)の代わりに、それを上書きの既存の値を変更します。

if attr = my_product.instance_variable_get :@attributes 
    attr[attrib.to_s] = value 
else 
    my_product.instance_variable_get :@attributes, { attrib.to_s => value } 
end 

instance_variable_setの使用が不完全と思われます。 Product自体にアクセサリーがないのはなぜですか?

class Product 
    def attributes 
    @attributes ||= {} 
    end 
end 

... 

token.values.each do |attr,v| 
    my_product.attributes.merge!(attr.to_s => v) 
end 
+0

それは動作しますが、「@attributes || = {}」が何をしているのか正確に説明できますか? – vmardian

+0

@vmardianこれは '@attributes = @attributes ||と同じです。 {} ';これは、すでに「_」が設定されていない限り、この変数をこの値に設定することを意味する[一般的なRubyイディオム](http://stackoverflow.com/questions/609612/ruby-code-explained/609853#609853)です。 (明示的に 'nil'や' false'を明示的に設定したいのであれば、実際にはそうではありませんが、まれなケースです)。 – Phrogz

関連する問題