6

Active Record を使用しているときに、オブジェクトのすべての属性をループする簡単な方法は次のとおりです。

order_item_object.attributes.each do |key,value|
....
end

しかし、Active Record を使用していない場合、これは機能しません。オブジェクトのすべての属性を反復処理するにはどうすればよいですか?

例: Rails にアクティブ レコードを使用しないモデルがあります。モデル order_item のオブジェクトは、order_item_object.product_id、order_item_object.quantity、order_item_object.quoted_price などのコントローラーで使用できます。しかし、私がorder_item_object.attributes.each do |k,v|....しようとすると、私は得るundefined method "attributes" for #<Order:0x00000005aa81b0>

これについてどうすればよいですか?

4

6 に答える 6

3

attr_accessorインスタンス変数を設定するいくつかのメソッドを作成する単なるマクロです。SO おそらくあなたが望むのは、instance_variables反復できるインスタンス変数の配列を返すメソッドです

class Foo
  attr_accessor :bar
  attr_accessor :baz
end

foo = Foo.new
foo.bar = 123
foo.baz
foo.instance_variables.each do |ivar_name|
  ivar_value = foo.instance_variable_get ivar_name
  # do something with ivar_name and ivar_value
end

しかし、私はこれを本当にお勧めしません。ActiveRecord がモデル データを別々に保持するのには理由があります。インスタンスには、インスタンス変数の多くの用途がある場合があります。たとえば、レコードがまだ保存されているかどうかを追跡したい場合があります。@savedこれは、モデルのデータではなくインスタンスの状態を反映する変数に保持される場合があります。

おそらく、代わりに属性のハッシュを保持したいですか?

于 2013-04-24T20:00:17.180 に答える
1

インスタンス変数の文字列表現が必要な場合は、次のようにします。

self.instance_values.keys.each do |k|
 ..
end

クラスに定義されているすべてのキー (文字列としてのインスタンス変数名) をループする必要があります。

于 2014-07-30T17:52:57.113 に答える
0

あまりエレガントではない方法:

class Test
  attr_accessor :firstname,:lastname
  def initialize(fn,ln); @firstname = fn; @lastname = ln; end
end

o = Test.new("Fernando", "Mendez")
o.instance_variables.each {|e| p o.send e.to_s.sub("@","").to_sym}
output:
"Fernando"
"Mendez"

キーと値のペアを追跡したい場合:

r = o.instance_variables.map {|e| Hash[e,(o.send e.to_s.sub("@","").to_sym)]}

#[{:@firstname=>"Fernando"}, {:@lastname=>"Mendez"}]
于 2013-04-24T20:04:18.147 に答える