Créer une table de jointure sans clé primaire
J'ai deux tables avec une beaucoup de beaucoup de relation que je suis en utilisant has_and_belongs_to_many à définir l'association.
class Foo < ActiveRecord::Base
...
has_and_belongs_to_many :bar
...
end
class Bar < ActiveRecord::Base
...
has_and_belongs_to_many :foo
...
end
J'ai aussi la classe définie pour représenter la table de jointure
class BarFoo < ActiveRecord::Base
...
belongs_to :foo
belongs_to :bar
...
end
Quand je lance le rake db:graines de j'obtiens l'erreur suivante:
Primary key is not allowed in a has_and_belongs_to_many join table (bar_foo)
Si j'ai éditer la base de données et supprimer le champ de clé primaire (ID) de la bar_foo table, puis réexécutez le rake db:graine tout fonctionne comme souhaité.
Donné ci-dessus, quel est le meilleur moyen de créer des tables de jointure dans les rails avec aucune clé primaire?
J'ai aussi essayé d'utiliser "has_many :bars, :par => :foo" et vice versa, mais j'ai reçu un message d'erreur quelque chose comme "undefined method 'klass' for nil:NilClass".
source d'informationauteur Keith
Vous devez vous connecter pour publier un commentaire.
Oui, la clé primaire n'est pas autorisé pour
has_and_belongs_to_many
.Vous avez 2 façons de résoudre ce problème:
Supprimer la clé primaire de cette table. Dans votre classe de migration:
En dehors de cela, vous devrez supprimer le fichier
bar_foo.rb
deapp/models
et retirer également le montage et les fichiers de test qui aurait pu être produite. Une bonne idée est d'appeler lescript/destroy
(ourails destroy
) pour détruire les fichiers et la régénération de la migration.Ou convertir
has_many :through
Si vous souhaitez utiliser une association HABTM vous ne devriez pas créer un modèle pour - juste une table
bars_foos
avecbar_id
etfoo_id
les colonnes de type entier.Si vous avez besoin du modèle entre les deux (par exemple, si vous souhaitez garder une trace de
created_at
ou d'autres attributs de la relation), vous pouvez ajouter d'autres modèle par exempleBarred
et puis, vous avez de l':Vous n'avez pas besoin du modèle
la
has_and_belongs_to_many
association recherche une table appeléebar_foo
dans votre base de données que vous devez faire est de générer une migration pour créer cette table.rails generate migration add_table_bar_foo_for_association
puis vous modifier votre migration et il devrait ressembler à ceci
Maintenant votre association de travail et aussi si vous avez besoin de l'association pour avoir des attributs supplémentaires sur les joindre, vous pouvez utiliser le
has_many :through
chemin et de créer un modèle associé à cette.