覆盖rails中的嵌套属性

Ana*_*and 14 ruby ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,

  1. 在Inside line_item_attributes=方法中,我可以添加/修改/删除订单的订单项吗?
  2. 什么时候被line_items_attributes=调用,如果我打电话@order.save(params)

Nat*_*ong 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
Run Code Online (Sandbox Code Playgroud)


Bef*_*ffa 8

  1. 是的,你可以.打电话吧

assign_nested_attributes_for_collection_association(:line_items, attributes, mass_assignment_options)

当你完成了.

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

  1. 来自文档:

保存

模型的所有更改(包括标记为销毁的模型的销毁)都会在保存父模型时自动保存并自动销毁.这发生在父节点方法启动的事务中.请参阅ActiveRecord :: AutosaveAssociation.

我不认为覆盖这种方法是个好主意.我会把你的代码添加到after_save钩子.

  • 如果可能的话,超级会是更好的选择.在边缘Rails(Rails 4)中,您将能够覆盖line_item_attributes = setter并调用super,但在Rails 3.2.x中,您目前不能只调用super.请参阅https://github.com/rails/rails/pull/2945 (3认同)