我有一個物件Foo,想一次為其分配多個屬性,類似于assign_attributesRails:
class Foo
attr_accessor :a, :b, :c
end
f = Foo.new
my_hash = {a: "foo", b: "bar", c: "baz"}
f.assign_attributes(my_hash)
除非類是 Rails 中的 ActiveRecord 模型,否則上述方法不起作用。有沒有辦法在Ruby中做到這一點?
uj5u.com熱心網友回復:
您可以自己實作批量分配方法。
一種選擇是通過以下方式設定相應的實體變數instance_variable_set:
class Foo
attr_accessor :a, :b, :c
def assign_attributes(attrs)
attrs.each_pair do |attr, value|
instance_variable_set("@#{attr}", value)
end
end
end
請注意,這將繞過任何自定義設定器。正如檔案中所說:
這可能會繞過類的作者打算進行的封裝,因此應謹慎使用。
另一種方法是通過public_send以下方式動態呼叫設定器:
def assign_attributes(attrs)
attrs.each_pair do |attr, value|
public_send("#{attr}=", value)
end
end
這相當于按順序設定每個單個屬性。如果已經(重新)定義了一個 setter 以包含對正在設定的值的約束和控制,則后一種方法尊重這一點。
如果您嘗試設定未定義的屬性,它也會引發例外:(因為相應的 setter 不存在)
f = Foo.new
f.assign_attributes(d: 'qux')
#=> NoMehodError: undefined method `d=' for #<Foo:0x00007fbb76038430>
此外,您可能希望確保傳遞的引數確實是一個哈希值,并且如果提供的屬性無效/未知,則可能會引發自定義例外。
uj5u.com熱心網友回復:
的assign_attributes是一個實體方法ActiveRecord
assign_attributes如果不使用,則必須定義方法ActiveRecord
def assign_attributes(attrs_hash)
attrs_hash.each do |k, v|
self.instance_variable_set("@#{k}", v)
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/365482.html
