rails - назначить существующую запись как вложенную ассоциацию при обновлении вложенных атрибутов - PullRequest
1 голос
/ 22 октября 2019

Я не использую форму рельсов, поскольку все это происходит из XML, который я анализирую. Для моего требования мне нужно назначить существующую запись как вложенную ассоциацию, одновременно обновляя выбранные атрибуты этой ассоциации.

Мои модели следующие:

class Listing < ApplicationRecord
  belongs_to :user, inverse_of: :listings
  accepts_nested_attributes_for :user
end

class User < ApplicationRecord
  has_many :listings, inverse_of: :user
  belongs_to :agency, inverse_of: :users
end

class Agency < ApplicationRecord
  has_many :users, inverse_of: :agency
end

Теперь,чтобы назначить существующую запись пользователя, мои параметры листинга должны быть

params = { user_id: 1230 }

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

params = { user_attributes: { agency_id: 3453 } }

Тогда, конечно, я делаю назначениеи сохраните:

listing.assign_attributes(params)
listing.save

Использование только прежних параметров не позволяет мне выполнить обновление agency_id в той же транзакции базы данных;при использовании последних параметров создается новая запись пользователя.

Моя первоначальная попытка заключалась в том, чтобы каким-то образом объединить два набора параметров:

params = { user_attributes: { id: 1230, agency_id: 3453 } }

Это привело к следующему:

ActiveRecord::RecordNotFound: Couldn't find User with ID= 1230 for PropertyListing with ID=

Sidenote: Я хотел бы иметь возможность поддерживать как обновление, так и создание действий с одинаковым набором параметров.

Поскольку это не сработало, я попробовал другой гибрид:

params = { user_id: 1230, user_attributes: { agency_id: 3453 } }

Но этот также создал нового пользователя с правильным agency_id, игнорируя атрибут user_id.

Есть ли способ назначить существующий User.find(1230) при обновлении того же пользователя agency_id втот же запрос ActiveRecord DB и набор параметров?

...