#ruby-on-rails #activerecord
#ruby-on-rails #activerecord
Вопрос:
У меня проблема, которую я не могу понять… В моем проекте у меня есть несколько моделей. У меня channel
их много restreams
, и у каждого повторного потока есть один provider
(это полиморфная ассоциация).
Итак, в коде я заменяю одно restream.provider
другим, и в конце restream.provider
имеет значение nil
. Я пытался поставить много результатов тестирования, так что теперь у меня такой результат: в одном из контроллеров у меня есть код:
puts channel.restreams.last.provider.to_json
byebug
Delayed::Job.enqueue(StartRestreamJob.new(air.id)) if air.server.online?
и puts
выводит именно то, что я ожидаю: объект поставщика, преобразованный в json. Но в start_restream_job
I также есть код:
air = Air.find(air_id)
channel = air.channel
puts channel.restreams.last.provider.to_json
byebug
и он предоставляет мне только null
строку. В результате restream
объект, сохраненный в базе данных, не имеет связи с. provider
В чем может быть проблема с этим?
Спасибо!
======================
Код, который присваивает новый provider
restream
:
new_provider = ProviderType1.new(restream.provider.params_hash)
#params hash provides some variables that I need to save from old provider
old_provider = restream.provider
new_provider.restream = restream
res = new_provider.initialize_event
#here some requests for external services are being made, after what some attributes of provider are being updated and after that provider is being saved by calling self.save!
if res == ProviderType1.SUCCESS_CODE
old_provider.restream = nil
old_provider.save!
old_provider.destroy
new_provider.restream = restream
restream.provider = new_provider
restream.save!
new_provider.save!
else
#smth that does not matter now
end
========================
UPD
Даже добавление принудительного сохранения как для restream, так и для provider не имеет никакого значения:
channel.restreams.each do |r|
r.provider.save!
r.save
end
У меня все еще есть новый provider
объект, сохраненный в БД, но он не связан с restream
object и наоборот.
=============
UPD 2
Добавление печати к предыдущему фрагменту кода открыло для меня новые вещи:
channel.restreams.each do |r|
r.provider.save!
r.save!
puts ProviderType1.find(r.provider_id).restream.to_json
завершение
Выводит распечатки null
. Значит ли это r.provider.save!
, что ничего не делает? И если да, то почему так? И почему он молчит? (Это выполняется в том месте кода, где puts channel.restreams.last.provider.to_json
выводится объект, а не null
)
Комментарии:
1. Я предполагаю, что вы не сохраняете смену поставщика. В вашем контроллере изменение видно, потому что поставщик только что назначен. Внутри worker вы повторно создаете Air и его ассоциации, но назначение поставщика теряется.
2. @AlexandreAngelim Пожалуйста, посмотрите обновление. Я также сохраняю как поставщика, так и повторный поток несколько раз в функции concern, которая вызывается внутри контроллера. Но все же добавление принудительного сохранения до завершения функции контроллера ничего не дает
3. Можете ли вы показать мне код, в котором вы назначаете нового поставщика для повторного потока?
4. @AlexandreAngelim Вот это после вопроса и перед UPD. Сейчас это выглядит довольно плохо, потому что я пытался изменить это многими способами, иногда я забываю, что я действительно хотел сделать =)
5. @AlexandreAngelim все больше и больше тестирует печать, снова и снова, я обнаружил, что перед
old_provider.restream = nil
записью в БД есть хорошие ассоциации, а после этого все терпит неудачу. Почему это может быть так? Напримерnew_provider.restream.to_json
null
, возвращает. Это в случае, если он обновляетсяrestream
и устанавливаетсяrestream.provider
наnil
? Как я могу отменить это обновление?
Ответ №1:
То, что мне помогло: добавление reload
restream
перед обновлением параметров, подобных этому: restream.reload.update_attributes(provider: new_provider)