2016-09-30 2 views
0

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)

+0

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. –

+0

@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

+0

Kannst du mir den Code zeigen, wo Sie den neuen Anbieter dem Restream zuweisen? –

Antwort

0

Die Sache, die mir geholfen haben: Hinzufügen reload-restream vor Parameter wie diese Aktualisierung: restream.reload.update_attributes(provider: new_provider)

Verwandte Themen