2016-09-30 3 views
0

У меня проблема, я не могу понять ... В моем проекте у меня есть несколько моделей. У меня есть 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 я также имеет код:

air = Air.find(air_id) 
channel = air.channel 
puts channel.restreams.last.provider.to_json 
byebug 

и предоставляет мне только null строки. В результате объект restream, сохраненный в базе данных, не имеет связи с provider. В чем может быть проблема?

Thanx!

======================

код, который назначает новый 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 и поставщик не делают Sence:

channel.restreams.each do |r| 
    r.provider.save! 
    r.save 
end 

У меня все еще есть новый объект provider, сохраненный в БД, но он не имеет никакого отношения к объекту restream и наоборот.

=============

UPD 2

Добавление печати в prevoious кусок кода открыл новые вещи для меня:

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)

+0

Моя догадка вы «не сохраняются изменения поставщика. В вашем контроллере изменения можно увидеть, поскольку поставщик только что был назначен. Внутри работника вы повторно создаете воздух и его ассоциации, но назначение поставщика теряется. –

+0

@AlexandreAngelim Пожалуйста, ознакомьтесь с обновлением.Я также сохраняю как провайдера, так и restream несколько раз в функции беспокойства, который называется внутренним контроллером. Но все же добавление силы сбережения до конца функции контроллера не делает вещь – Ngoral

+0

Можете ли вы показать мне код, в котором вы назначаете нового провайдера для отдыха? –

ответ

0

То, что помогло мне: добавление reload к restream перед обновлением параметров, как это: restream.reload.update_attributes(provider: new_provider)

Смежные вопросы