Rails - динамически добавлять больше вложенных атрибутов - PullRequest
0 голосов
/ 17 января 2020

Это кажется довольно тривиальной проблемой, но я не могу ее решить. У меня есть две таблицы invoices и invoice_items. В модели счета:

accepts_nested_attributes_for :invoice_items, allow_destroy: true, reject_if: :all_blank

Теперь в методе, основанном на некоторых условиях, я хочу динамически добавлять больше элементов счета. В обратном вызове before_save я делаю что-то вроде этого:

def process_amounts
  if condition_holds
    self.invoice_items_attributes << {key_1: value_1, key_2: value_2} # Pseudo code.
  end
end

Но этот фрагмент кода вызывает ошибки. Похоже, только сеттер доступен для nested_attributes.

NoMethodError Исключение: неопределенный метод `invoice_items_attributes 'для # Invoice: 0x007fd4de84a7a0

Я также попробовал другой подход, который привел к другому поведение:

def process_amounts
  if condition_holds
    self.invoice_items_attributes = invoice_items.map(&:attributes) + [{key_1: value_1, key_2: value_2}] # Pseudo code.
  end
end

Приведенный выше фрагмент кода приводит к 3 элементам! Он не переназначает invoice_items_attributes.

Так как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 17 января 2020

Попробуйте это

 if condition_holds
    self.invoice_items << InvoiceItem.new(key_1: value_1, key_2: value_2)
 end

Я предполагаю, что InvoiceItem - это название модели invoice_items.

0 голосов
/ 17 января 2020

invoice_item_attributes доступно только в параметрах (Контроллер). Вы можете сделать это в счете-фактуре модели в обратном вызове before_save следующим образом.

before_save: process_amounts

def process_amounts
 if condition_holds
   self.invoice_items.build([{key: value, key2: value2},{key: value, key2: value2}])
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...