2017-08-07 4 views
0

ich folgende Modelle haben:Erstellen eines Datensatzes mit has_many: through?

class Department < ApplicationRecord 
    has_many :department_job_titles 
    has_many :job_titles, through: :department_job_titles 
end 

class JobTitle < ApplicationRecord 
    has_and_belongs_to_many :departments 
end 

class DepartmentJobTitle < ApplicationRecord 
    belongs_to :department 
    belongs_to :job_title 
    validates :department_id, uniqueness: { scope: :job_title_id } 
end 

Dies ist irrende w PG::UndefinedColumn: ERROR: column department_job_titles.title does not exist LINE 1: ... "department_job_titles"."department_id" = $1 AND "departmen...

Department.first.department_job_titles.find_or_create_by(title: title) 

DepartmentJobTitle die folgenden Felder hat: id, department_id, job_title_id

Was mache ich falsch hier? Dank

+1

Versuchen Sie, ein neues 'JobTitle' hinzuzufügen, ein neues' DepartmentJobTitle' für ein bestehendes 'JobTitle' hinzuzufügen oder beides hinzuzufügen? –

+0

Ich habe schon die Abteilung erstellt ... ich war. Das versuche ich mit 'Department.first' darzustellen ... Ich versuche nun der Abteilung ein JobTitle zuzuweisen und ich muss entweder das JobTitle erstellen oder es über das DepartmentJobTitle-Modell finden und zuweisen .... – AnApprentice

Antwort

1

Versuchen Sie folgendes:

job_title = JobTitle.find_or_create_by(title: title) 
Department.first.job_titles << job_title unless job_title.in? Department.first.job_titles 

Oder dass zweite Linie sein könnte:

auch:

class JobTitle < ApplicationRecord 
    has_many :department_job_titles 
    has_many :departments, through: :department_job_titles 
end 

... und ...

class DepartmentJobTitle < ApplicationRecord 
    belongs_to :department 
    belongs_to :job_title 
    validates :department, presence: true, uniqueness: { scope: :job_title } 
    validates :job_title, presence: true 
end 

... und darüber nachdenken, welches Verhalten Sie wollen, wenn jemand eine JobTitle oder Department zerstört - entweder wollen Sie die DepartmentJobTitle auch zerstört, oder Sie wollen die destroy verhindert werden, erwarte ich.

+0

Danke, aber habe ich die modellzuordnungen richtig eingerichtet? – AnApprentice

+1

Ah guter Punkt. Ich habe aktualisiert. Ich würde auch validieren basierend auf den Namen der Assoziationen, nicht die IDs: "validates: Abteilung, Eindeutigkeit: {scope:: job_title}", und fügen Sie inverse: 'Optionen auf der' has_many' hinzu. –

+0

Ich bin mir nicht sicher, ob ich dem umgekehrten Vorschlag folge ... Wo würde ich das hinzufügen und warum? – AnApprentice

Verwandte Themen