Rails: создание / обновление отношений has_many для существующих записей has_many - PullRequest
0 голосов
/ 07 марта 2019

Учитывая:

class Group < ApplicationRecord
  has_many :customers, inverse_of: :group
  accepts_nested_attributes_for :customers, allow_destroy: true
end

class Customer < ApplicationRecord
  belongs_to :group, inverse_of: :customers
end

Я хочу создать / обновить группу и назначить существующих клиентов в группу, например:

Group.new(customers_attributes: [{ id: 1 }, { id: 2 }])

Это не работает, потому что Rails просто выбрасываетActiveRecord::RecordNotFound: Couldn't find Customer with ID=1 for Group with ID= (или ID=the_group_id, если я обновляю Group).Единственный способ, который я нашел, чтобы исправить это, это просто извлечь customers_attributes, а затем сделать отдельный Customer.where(id: [1,2]).update_all(group_id: 'groups_id') после вызова Group save!.

Кто-нибудь еще сталкивался с этим?Я чувствую, что способ исправить это - работать с ключом вроде _existing: true внутри customers_attributes (так же, как _destroy: true используется для аннулирования внешнего ключа).Или что-то подобное нарушает принцип Rails, которого я не вижу?

1 Ответ

0 голосов
/ 07 марта 2019

На самом деле, для этого вам не нужно использовать вложенные атрибуты, вместо этого вы можете напрямую установить атрибут association_ids:

Group.new(customer_ids: [1, 2])

Это автоматически обновит идентификатор group_id для каждого упомянутого Клиента при сохранении записи.

...