Rails - 扩展属性方法

时间:2016-01-01 00:33:25

标签: ruby-on-rails

我有一组输入,我期望大量的数据(对象列表),所以我希望创建/更新操作的这个输入包含在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

1 个答案:

答案 0 :(得分:0)

试试这个:

def attributes
  new_attributes={}
  ACCOUNT_FIELDS.each do |field|
    new_attributes[field]=self.send(field)
  end
  super.merge(new_attributes)
end