Désolé si cette question semble simple, je suis très très nouveau sur Rails (j'ai commencé à apprendre il y a quelques jours), mais après avoir consulté Google et "Développement Web Agile avec Rails" je ne trouve pas la réponse .Rails Clé étrangère Numéro
J'ai un problème avec Rails 2.3.8 créant une clé étrangère sur deux modèles. Mes tables ressemblent à ceci:
cars manufacturer
---- ------------
car_make name
car_model country
car_class logo_url
image_url (and default 'id' created by Rails)
manufacturer_id
(and default 'id' created by Rails)
Mes champs 'car_make' et 'name' sont essentiellement les mêmes; chaque voiture que je crée, je veux être en mesure de l'associer à un fabricant existant. C'est la colonne que j'essaie de créer FK.
Mon car.rb a 'belongs_to: manufacturer', et mon manufacturer.rb a 'has_many: cars' pour établir un rapport de un fabricant à plusieurs voitures. Cependant, lorsque je crée une nouvelle voiture (via un échafaudage), le champ manufacturer_id est vide.
Je suis allé à mon cars_controller, a trouvé la méthode « créer » qui est utilisé, et essayé d'ajouter la deuxième ligne ci-dessous:
@car = Car.new(params[:car])
@car.manufacturer_id = car.manufacturer.id # <===
Cela produit un « NameError dans CarsController # créer » erreur, et Je vois:
undefined local variable or method 'car' for #<CarsController:0x1034642f0>
Rails ne semble pas aimer la ligne que j'ai ajoutée. Qu'est-ce qui me manque pour faire ce travail?
Ah c'est logique. Je veux trouver le bon manufacturer_id correspondant au champ car_make. Par exemple, si ma table Manufacturer est remplie avec 'Acura', 'Honda' et 'Toyota' sous la colonne des noms, et que je crée une nouvelle voiture avec car_make 'Honda', je veux trouver le bon manufacturer_id qui est dans la rangée 'Honda'. – Anon
Ah ah, alors vous ne devriez pas faire ça. Car make doit être trouvé via 'car.manufacturer.name', pas dupliqué sur la voiture elle-même! – rfunduk
Afin de le pirater pour que cela fonctionne (* mauvaise idée *), vous pouvez essayer: '@car.manufacturer = Manufacturer.find_by_name (@ car.car_make); @ car.save' qui va essayer de trouver le manuf par le champ car_make de la voiture que vous venez de mettre à jour ... Encore une fois, va avoir un mauvais moment si vous allez trop loin dans ce chemin :) – rfunduk