[英]Looping over attributes of object of a Non-Active-Record-Model
使用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>
我該怎么辦呢?
嘗試這個:
class Parent
def self.attr_accessor(*vars)
@attributes ||= []
@attributes.concat vars
super(*vars)
end
def self.attributes
@attributes
end
def attributes
self.class.attributes
end
end
class ChildClass < Parent
attr_accessor :id, :title, :body
end
p ChildClass.new.attributes.inspect #=> [:id, :title, :body]
attr_accessor
只是一個宏,它創建了一些設置實例變量的方法。 或許你想要的是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
變量中,該變量反映實例的狀態,但不反映模型的數據。
也許你想保留屬性的哈希值?
這是我發現的最佳方式
item=self.instance_values.symbolize_keys
item.each do |k,v|
...
..
end
有一個代碼可以在這里顯示它的用法(查看問題本身的更新) - 通過哈希中的元素進行分組
如果需要實例變量的字符串表示,可以執行以下操作:
self.instance_values.keys.each do |k|
..
end
這應該循環遍歷為您的類定義的所有鍵(實例變量名稱為字符串)。
您引用的屬性是ActiveRecord模型上的實例變量,它返回模型db屬性的哈希值。
除非您明確定義,否則非ActiveRecord模型將不具有您正在調用的屬性方法。 所有對象都有一個名為instance_variables的方法,您可以使用該方法獲取屬性名稱列表,然后反射性地查找屬性值。
這不是一個非常優雅的方式:
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"}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.