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
Jak dodać do Agents
modelu Customer
?
Czy to najlepszy sposób?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
Powyższe działa dobrze z konsoli, jednak nie wiem, jak to osiągnąć w rzeczywistej aplikacji.
Wyobraź sobie, że dla klienta wypełniany jest formularz, który również przyjmuje house_id
jako dane wejściowe. Następnie mam wykonać następujące czynności na moim kontrolerze?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
Ogólnie jestem zdezorientowany, jak dodawać rekordy w has_many :through
tabeli?
ruby-on-rails
activerecord
has-many-through
Mikrofon
źródło
źródło
Odpowiedzi:
Myślę, że możesz po prostu zrobić to:
Lub tworząc nowy dom dla klienta:
Możesz również dodać za pomocą identyfikatorów:
źródło
build
istead ofcreate
?<<
operatora powoduje dwukrotne wstawienie w niektórych przypadkach. Więccreate
metoda jest najlepsza.„Najlepszy sposób” zależy od Twoich potrzeb i tego, co jest dla Ciebie najwygodniejsze. Zamieszanie wynika z różnic w zachowaniu ActiveRecord z
new
orazcreate
metod i<<
operatora.new
Metodanew
nie doda za Ciebie rekordu skojarzenia. Musisz sam zbudowaćHouse
iAgent
nagrywać:Zauważ, że
@cust.houses.new
iHouse.new
faktycznie są takie same, ponieważ musisz utworzyćAgent
rekord w obu przypadkach.<<
OperatorJak wspomina Mischa, możesz również użyć
<<
operatora na kolekcji. To zbuduje tylkoAgent
model dla Ciebie, musisz zbudowaćHouse
model:create
Metodacreate
utworzy zarównoHouse
iAgent
rekordy, jak i dla Ciebie, ale będziesz musiał znaleźćAgent
model, jeśli zamierzasz przywrócić go do widoku lub interfejsu API:Na koniec, jeśli chcesz, aby wyjątki były zgłaszane podczas tworzenia,
house
użyj zamiast tego operatorów bang (np.new!
Icreate!
).źródło
agent = @cust.houses.find(house.id)
brzmiećagent = @cust.agents.find(house.id)
?agent
Zmienna w „Nowa metoda” różni sięagent
w dalszych przykładach. Może to spowodować zamieszanie dla osób pracujących z dodatkowymi atrybutami w tabeli łączenia.Innym sposobem dodawania asocjacji jest użycie kolumn klucza obcego:
Lub użyj dokładnych nazw kolumn, przekazując identyfikator skojarzonego rekordu zamiast rekordu.
źródło