Ich habe zwei zugehörige Modelle, Mitarbeiter und Arzt:
class Employee < ActiveRecord::Base
has_one :doctor, :dependent => :destroy
...
end
class Doctor < ActiveRecord::Base
belongs_to :employee
end
Wenn der Arzt bereits erstellt und gespeichert wurde.
Ich möchte Zugriff auf die Ärzte-ID in den Mitarbeitern erhalten. After_save Rückruf:
class Employee < ActiveRecord::Base
...
after_save :save_picture
...
private
def save_picture
if doctor
file_name = "doctor_" + doctor.id.to_s + ".jpg"
...
end
end
end
Ich kann auf jede Methode eines Arztes zugreifen und jede von ihnen funktioniert einwandfrei, aber "id" - es gibt "nil" zurück.
Was mache ich falsch?
Antworten:
0 für die Antwort № 1Hat Ihr Doctor-Modell einen ID-Accessor?
Versuchen doctor_id
Anstatt von doctor.id
, eine Datenbankabfrage weniger :)
0 für die Antwort № 2
Ich fand heraus, wo mein Fehler war:
Ich hatte einen schlechten Accessor in Employee
Klasse
class Employee < ActiveRecord::Base
...
def is_doctor= val
create_doctor if val == "1"
end
...
end
Es wurde versucht, einen neuen Arzt zu erstellen, aber es liegt ein Fehler bei der Aktualisierungsaktion vor. Danach war das ID-Attribut des Arztes im "Selbst" -Objekt leer.
Die Lösung bestand darin, Assoziationsmanipulationen einem anderen zuzuordnen after_save
Ruf zurück:
class Employee < ActiveRecord::Base
has_one :doctor, :dependent => :destroy
after_save :save_roles
after_save :save_picture
...
def is_doctor= val
@doc = true if val == "1"
end
private
def save_roles
if doctor
doctor.destroy unless @doc
else
create_doctor if @doc
end
@doc = nil
end
def save_picture
if doctor
file_name = "doctor_" + doctor.id.to_s + ".jpg"
...
end
end
end