当我在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
在上面的代码中,
line_item_attributes=
方法内,我可以添加/修改/删除订单的订单项吗?line_items_attributes=
,如果我拨打@order.save(params)
?答案 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)
assign_nested_attributes_for_collection_association(:line_items, attributes, mass_assignment_options)
当你完成了。
检查来源:# File activerecord/lib/active_record/nested_attributes.rb, line 263
保存
模型的所有更改,包括标记为的标记的销毁 破坏,自动保存和销毁,以及原子 父模型已保存。这发生在交易中 由父母发起的保存方法。看到 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