web-dev-qa-db-fra.com

Rails migration: t.références avec un nom alternatif?

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
104
themirror

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

12
themirror

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}
138
Ryan

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

Mise à jour

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
80
Toby 1 Kenobi

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"
6

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 
3
Ju Nogueira