2016-09-30 12 views
0

私には理解できない問題があります... 私のプロジェクトにはいくつかのモデルがあります。私は多くのrestreamsを持っているchannelを持っていて、各restreamはprovider(それは多形的なassosiationです)を持っています。更新パラメータのRailsの問題

コードでは、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!

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 

=====:providerrestreamに新しい割り当て

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

コード

:===================でもrestreamとプロバイダーの両方の力の節約を追加する

UPD

は、任意のローミングサービスをしません

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

私はまだDBに保存された新しいproviderオブジェクトを持っていますが、restreamオブジェクトとの接続はありません。逆も同様です。コードのprevoious片に印刷を追加する

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

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!は何もしませんか?そして、はいの場合は、どうしてですか?なぜそれが沈黙しているのですか?

+0

私の最高の推測ではあなたですプロバイダの変更を維持していません。コントローラでは、プロバイダが割り当てられたばかりなので、変更が表示されます。ワーカーの内部では、Airとその関連付けを再インスタンス化しますが、プロバイダの割り当ては失われます。 –

+0

@AlexandreAngelim更新をご覧ください。私はまた、内部のコントローラと呼ばれる懸念関数で何度かプロバイダと再ストリームの両方を保存します。しかし、コントローラの機能が終了する前に力を節約して追加することはできません – Ngoral

+0

新しいプロバイダを再ストリームに割り当てるコードを表示できますか? –

答えて

0

私を助けた事(これはputs channel.restreams.last.provider.to_jsonプリントアウトオブジェクトではなく、nullコード、の代わりに、実行されます):このようなパラメータを更新する前restreamreloadを追加:restream.reload.update_attributes(provider: new_provider)