class Agents << ActiveRecord::Base
belongs_to :customer
belongs_to :house
end
class Customer << ActiveRecord::Base
has_many :agents
has_many :houses, through: :agents
end
class House << ActiveRecord::Base
has_many :agents
has_many :customers, through: :agents
end
Wie füge ich dem Agents
Modell für hinzu Customer
?
Ist das der beste Weg?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
Das obige funktioniert gut von der Konsole aus, ich weiß jedoch nicht, wie ich dies in der tatsächlichen Anwendung erreichen kann.
Stellen Sie sich vor, für den Kunden wird ein Formular ausgefüllt, das auch house_id
als Eingabe dient. Dann mache ich folgendes in meinem Controller?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
Insgesamt bin ich verwirrt, wie Datensätze in die has_many :through
Tabelle aufgenommen werden sollen.
Antworten:
Ich denke, Sie können dies einfach tun:
Oder wenn Sie ein neues Haus für einen Kunden erstellen:
Sie können auch über IDs hinzufügen:
quelle
build
stattdessen verwendencreate
?<<
Operators in bestimmten Fällen zweimal einfügt. Diecreate
Methode ist also der beste Weg.Der beste Weg hängt von Ihren Bedürfnissen ab und davon, was sich am angenehmsten anfühlt. Verwirrung kommt aus Unterschieden Active das Verhalten der
new
undcreate
Methoden und dem<<
Betreiber.Die
new
Methodenew
fügt keinen Assoziationsdatensatz für Sie hinzu. Sie müssen dieHouse
undAgent
Aufzeichnungen selbst erstellen :Beachten Sie, dass
@cust.houses.new
undHouse.new
praktisch gleich sind, da Sie denAgent
Datensatz in beiden Fällen erstellen müssen .Der
<<
BetreiberWie Mischa erwähnt, können Sie auch den
<<
Operator für die Sammlung verwenden. Dadurch wird nur dasAgent
Modell für Sie erstellt. Sie müssen dasHouse
Modell erstellen :Die
create
Methodecreate
erstellt beideHouse
undAgent
Datensätze für Sie, aber Sie müssen dasAgent
Modell finden, wenn Sie dies zu Ihrer Ansicht oder API zurückgeben möchten:Wenn Sie beim Erstellen Ausnahmen auslösen möchten,
house
verwenden Sie stattdessen die Bang-Operatoren (z . B.new!
undcreate!
).quelle
agent = @cust.houses.find(house.id)
lesenagent = @cust.agents.find(house.id)
? Dieagent
Variable in der "neuen Methode" unterscheidet sich von deragent
in den letzteren Beispielen. Dies kann zu Verwirrung bei Personen führen, die mit zusätzlichen Attributen in der Verknüpfungstabelle arbeiten.Eine andere Möglichkeit, Assoziationen hinzuzufügen, besteht in der Verwendung der Fremdschlüsselspalten:
Oder verwenden Sie die genauen Spaltennamen und übergeben Sie die ID des zugeordneten Datensatzes anstelle des Datensatzes.
quelle