переопределить вложенные атрибуты в рельсах - PullRequest
13 голосов
/ 23 января 2012

что происходит, когда я переопределяю метод вложенных атрибутов в рельсах. Например,

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 ]

9 голосов
/ 12 апреля 2013

Используйте псевдоним

. В Rails 4 вы можете переопределить и вызвать super.

. В более ранних версиях вы можете использовать Ruby's 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
.
8 голосов
/ 23 января 2012
  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 hook.

1 голос
/ 22 февраля 2017

Я встретил ту же проблему.Благодаря некоторым усилиям я решил проблему.Может быть, кто-то ответит на тот же вопрос, поэтому я выложу ответ здесь.

attr_writer перезаписать исходный установщик line_items Затем вызвать super, поместить результат в установщик по умолчанию

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...