Ich habe ein Problem, das ich nicht verstehen kann ... In meinem Projekt habe ich mehrere Modelle. Ich habe channel
, die viele restreams
hat und jeder Reststream hat eine provider
(es ist eine polymorphe Assoziation).Schienen Probleme mit Update-Parametern
Also in Code I ersetzen Sie einen restream.provider
durch einen anderen, und am Ende restream.provider
hat einen Wert von . Ich habe versucht, eine Menge Tests Ausgang zu setzen, so jetzt habe ich ein solches Ergebnis: in einem der Controller Ich habe einen Code:
puts channel.restreams.last.provider.to_json
byebug
Delayed::Job.enqueue(StartRestreamJob.new(air.id)) if air.server.online?
und puts
Ausgänge genau das, was ich erwarte, dass: Provider-Objekt umgewandelt json. Aber in start_restream_job
ich auch Code:
air = Air.find(air_id)
channel = air.channel
puts channel.restreams.last.provider.to_json
byebug
und es gibt mir nur mit null
String. Als Ergebnis hat das in der Datenbank gespeicherte Objekt restream
keine Zuordnung zu provider
. Was kann das Problem sein?
Danke!
======================
Code, der neue provider
zu restream
zuordnet:
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
Auch Kraft Einsparung sowohl ReStream und Anbieter Hinzufügen keinen Sinn machen:
channel.restreams.each do |r|
r.provider.save!
r.save
end
Ich habe immer noch ein neues provider
Objekt in DB gespeichert, aber es hat keine Verbindung mit restream
Objekt und umgekehrt.
=============
UPD 2
Druck prevoious Stück Code Hinzufügen eröffnet eine neue Dinge für mich:
channel.restreams.each do |r|
r.provider.save!
r.save!
puts ProviderType1.find(r.provider_id).restream.to_json
Ende
Fügt Drucke aus null
. Also bedeutet das r.provider.save!
tut nichts? Und wenn ja, warum? Und warum schweigt es? (Diese läuft in einer Stelle im Code, wo puts channel.restreams.last.provider.to_json
druckt ein Objekt aus, nicht null
)
Meine beste Vermutung Sie ist Ich halte den Providerwechsel nicht aufrecht. In Ihrem Controller ist die Änderung zu sehen, da der Provider gerade zugewiesen wurde. Innerhalb des Arbeiters instanziieren Sie Air und seine Verknüpfungen erneut, aber die Providerzuweisung ist verloren. –
@AlexandreAngelim Bitte sehen Sie ein Update.Ich speichere sowohl Provider als auch restream mehrfach in der concern Funktion, das heißt im Controller. Aber noch eine Krafteinsparung vor dem Ende der Controller-Funktion hinzufügen macht das Ding nicht – Ngoral
Kannst du mir den Code zeigen, wo Sie den neuen Anbieter dem Restream zuweisen? –