J'ai donc une table create_table comme celle-ci pour les cours dans une école:
create_table :courses do |t|
t.string :name
t.references :course
t.timestamps
end
mais je veux qu'il fasse référence à deux autres cours comme:
has_many :transferrable_as # A Course
has_many :same_as # Another Course
Puis-je dire ce qui suit?
t.references :transferrable_as, :as=> :course
Je pense que ce fil a une manière plus Rails-ish différente: Scaffolding ActiveRecord: deux colonnes du même type de données
Dans la migration:
t.belongs_to: transferrable_as
t.belongs_to: same_as
Vous pouvez faire tout cela dans la définition de migration/colonne initiale (au moins actuellement dans Rails 5):
t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
Vous pouvez le faire de cette façon:
create_table :courses do |t|
t.string :name
t.references :transferrable_as, references: :courses
t.references :same_as, references: :courses
t.timestamps
end
ou en utilisant t.belongs_to
comme alias pour t.references
Vous ne pouvez pas ajouter foreign_key: true
à ces deux lignes de référence. Si vous voulez les marquer comme clés étrangères au niveau de la base de données, vous devez effectuer une migration avec ceci:
add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id
Dans Rails 5.1 et supérieur, vous pouvez ajouter la clé étrangère à la migration dans le create_table
bloquer comme ceci:
create_table :courses do |t|
t.string :name
t.references :transferrable_as, foreign_key: { to_table: 'courses' }
t.references :same_as, foreign_key: { to_table: 'courses' }
t.timestamps
end
En réponse à cette question, le modèle devrait comporter la ligne suivante pour compléter l’association:
belongs_to :transferrable_as, class_name: "Course"
belongs_to :same_as, class_name: "Course"
Je ne pense pas que references
accepte les :as
_ option, mais vous pouvez créer vos colonnes manuellement ...
create_table :courses do |t|
t.string :name
t.integer :course1_id
t.integer :course2_id
t.timestamps
end