私には理解できない問題があります... 私のプロジェクトにはいくつかのモデルがあります。私は多くの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
=====:provider
restream
に新しい割り当て
======================
コード
:===================でも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!
は何もしませんか?そして、はいの場合は、どうしてですか?なぜそれが沈黙しているのですか?
私の最高の推測ではあなたですプロバイダの変更を維持していません。コントローラでは、プロバイダが割り当てられたばかりなので、変更が表示されます。ワーカーの内部では、Airとその関連付けを再インスタンス化しますが、プロバイダの割り当ては失われます。 –
@AlexandreAngelim更新をご覧ください。私はまた、内部のコントローラと呼ばれる懸念関数で何度かプロバイダと再ストリームの両方を保存します。しかし、コントローラの機能が終了する前に力を節約して追加することはできません – Ngoral
新しいプロバイダを再ストリームに割り当てるコードを表示できますか? –