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
Comment puis-je ajouter au Agents
modèle pour Customer
?
Est-ce le meilleur moyen?
Customer.find(1).agents.create(customer_id: 1, house_id: 1)
Ce qui précède fonctionne bien depuis la console, cependant, je ne sais pas comment y parvenir dans l'application réelle.
Imaginez qu'un formulaire soit rempli pour le client qui soit également pris house_id
en compte. Puis-je faire ce qui suit dans mon contrôleur?
def create
@customer = Customer.new(params[:customer])
@customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
@customer.save
end
Dans l'ensemble, je ne sais pas comment ajouter des enregistrements dans le has_many :through
tableau?
Réponses:
Je pense que vous pouvez simplement faire ceci:
Ou lors de la création d'une nouvelle maison pour un client:
Vous pouvez également ajouter via des identifiants:
la source
build
istead ofcreate
?<<
opérateur effectue l'insertion deux fois dans certains cas. Lacreate
méthode est donc la meilleure.«La meilleure façon» dépend de vos besoins et de ce qui vous convient le mieux. La confusion provient des différences de comportement ActiveRecord des
new
etcreate
méthodes et l'<<
opérateur.La
new
méthodenew
n'ajoutera pas d'enregistrement d'association pour vous. Vous devez créer vous-même les enregistrementsHouse
etAgent
:Notez que
@cust.houses.new
etHouse.new
sont effectivement les mêmes car vous devez créer l'Agent
enregistrement dans les deux cas.L'
<<
opérateurComme le mentionne Mischa, vous pouvez également utiliser l'
<<
opérateur sur la collection. Cela ne construira leAgent
modèle que pour vous, vous devez construire leHouse
modèle:La
create
méthodecreate
construira les deuxHouse
et lesAgent
enregistrements pour vous, mais vous devrez trouver leAgent
modèle si vous avez l'intention de le renvoyer dans votre vue ou votre API:Pour finir, si vous voulez que des exceptions soient levées lors de la création,
house
utilisez plutôt les opérateurs bang (par exemplenew!
etcreate!
).la source
agent = @cust.houses.find(house.id)
lire à laagent = @cust.agents.find(house.id)
place? Laagent
variable de la "nouvelle méthode" est différente de celleagent
des derniers exemples. Peut créer une certaine confusion pour les personnes travaillant avec des attributs supplémentaires sur la table de jointure.Une autre façon d'ajouter des associations consiste à utiliser les colonnes de clé étrangère:
Ou utilisez les noms de colonne exacts, en passant l'ID de l'enregistrement associé au lieu de l'enregistrement.
la source