Проблемы Rails с параметрами обновления

#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)