簡體   English   中英

循環非活動記錄模型的對象的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM