ActiveRecord - Как связать (несохраненный) дочерний элемент (несохраненного) родителя с другим объектом перед сохранением всех объектов - PullRequest
0 голосов
/ 16 ноября 2018

Я относительно новичок в Rails и Ruby и столкнулся со следующим вопросом.

У меня есть 3 объекта:

  1. Родительский объект называется Partner

    • Имеет много Tariffs
  2. объект с именем Tariff
    • Принадлежит к Partner
  3. третий объект, имеющий отношение к дочернему объекту, называется User
    • Принадлежит к Tariff

Когда я создаю нового Партнера (partner = Partner.new) и новый тариф (tariff = Tariff.new) и добавляю тариф к партнеру (Partner.tariffs << tariff), я могу сохранить отношения Партнера с ним, выполнив partner.save!.

Но в моей ситуации я также получаю пользователя из базы данных (user = User.find.last) и хочу напрямую добавить ассоциацию с тарифом, прежде чем сохранить все в базе данных. Это потому, что я хочу сохранить / обновить все в одной транзакции, чтобы в случае ошибки все было поддержано ролью.

Я пробовал много способов добиться этого, но не могу этого сделать. Я думал, что это будет примерно так:

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff
user = User.find.last
user.tariff = tariff

ActiveRecord::Base.transaction.do
  partner.save!
  user.save!
end

или

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff
user = User.find.last
user.tariff = tariff

ActiveRecord::Base.transaction.do
  partner.save!
  user.save!
end

или

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff
user = User.find.last
user.tariff_id = tariff.id (or something similar) 

ActiveRecord::Base.transaction.do
  partner.save!
  user.save!
end

Я понимаю, что некоторые из моих дел / примеров не могут работать, поскольку нет tariff.id и нет partner.tariff.last, пока объекты не сохранены в базе данных.

Было бы неплохо, если бы кто-нибудь мне помог, заранее спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Я решил свою проблему так:

partner = Partner.new
tariff = Tariff.new
partner.tariffs << tariff

ActiveRecord::Base.transaction.do
  partner.save!
  user.update_attributes(:tariff_id => tariff.id)
end

Это работает, потому что у объекта тарифа есть идея после вызова метода save. Тариф также сохраняется при сохранении партнера, поскольку дочерний объект является новым объектом и дочерним элементом первого уровня партнера. К сожалению, дети ребенка не сохраняются автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...