我有一组输入,我期望大量的数据(对象列表),所以我希望创建/更新操作的这个输入包含在ActiveRecord事务中。
模型Student
,其中包含Account
。
ACCOUNT_FIELDS=[:name, :surname, :email, :phone, :activated]
has_one :account, :as => :account_holder, autosave: true, :dependent => :destroy
validates_associated_extended :account
ACCOUNT_FIELDS.each do |action|
define_method action do
get_or_build_account.send(action)
end
setter_action = action.to_s + "="
define_method setter_action do |arg|
get_or_build_account.send(setter_action, arg)
end
end
这里我制作了一个读者/作者方法,因此@student.name
将从帐户返回相关数据,我也可以@student
通过autosave
分配它。
问题:正如我所说,我希望它包含在交易中,所以在我的控制器中我不能保存任何东西。每个学生都是这样分配的
student.attributes = #...data
学生后来转到交易区。
但是!对于此特定模型,我希望student.attributes
也返回ACCOUNT_FIELDS
。
通常它适用于student.account_attributes
,但正如我所说的,后来student
在事务中被处理,并且它是由模块制作的,我希望它可以重复用于其他一些模型(它没有&#39} ; t需要这个逻辑)。
因此,我不希望在某些条件下修改模块代码,而是希望此模型的实例在调用时返回所需的帐户字段 self.attributes
@student.attributes #=> :school_id => 1, :name => "John"...
其中self.name
self.account.name
答案 0 :(得分:0)
试试这个:
def attributes
new_attributes={}
ACCOUNT_FIELDS.each do |field|
new_attributes[field]=self.send(field)
end
super.merge(new_attributes)
end