覆盖rails中的嵌套属性

时间:2012-01-23 08:45:20

标签: ruby-on-rails ruby ruby-on-rails-3

当我在rails中覆盖嵌套属性方法时会发生什么。例如,

class Order
  has_many :line_items
  accepts_nested_attributes_for :line_items

  def line_item_attributes=(attr)
   # what can I do here.
  end
end

class LineItem
  belongs_to :order
end

在上面的代码中,

  1. line_item_attributes=方法内,我可以添加/修改/删除订单的订单项吗?
  2. 何时调用line_items_attributes=,如果我拨打@order.save(params)

3 个答案:

答案 0 :(得分:9)

使用别名

在Rails 4中,您可以覆盖并调用super

在早期版本中,您可以使用Ruby的alias

class Order
  has_many :line_items
  accepts_nested_attributes_for :line_items

  # order of arguments is new_name, existing_name
  alias :original_line_items_attributes= :line_items_attributes=
  def line_items_attributes=(attrs)
   modified_attributes                 = my_modification_method(attrs)
   self.original_line_items_attributes = modified_attributes
  end

end

答案 1 :(得分:8)

  1. 是的,你可以。只需致电
  2. assign_nested_attributes_for_collection_association(:line_items, attributes, mass_assignment_options)

    当你完成了。

    检查来源:# File activerecord/lib/active_record/nested_attributes.rb, line 263

    1. 来自文档:
    2.   

      保存

           

      模型的所有更改,包括标记为的标记的销毁   破坏,自动保存和销毁,以及原子   父模型已保存。这发生在交易中   由父母发起的保存方法。看到   ActiveRecord的:: AutosaveAssociation。

      我认为覆盖此方法不是一个好主意。我会将您的代码添加到after_save挂钩。

答案 2 :(得分:1)

我遇到了同样的问题。 通过一些努力,我解决了这个问题。 也许有人会遇到同样的问题,所以我在这里发布答案。

attr_writer覆盖line_items的原始制定者 然后调用super,将结果放入默认的setter

class Order
  attr_writer :line_items
  has_many :line_items
  def line_items=(value)
    # manipulate value
    # then send result to the default setter
    super(result)
  end