Railsmigratie: t.references met alternatieve naam?

Dus ik heb een create_table zoals deze voor cursussen op een school:

create_table :courses do |t|
  t.string :name
  t.references :course
  t.timestamps
end

maar ik wil dat het verwijst naar tweeandere cursussen, zoals:

has_many :transferrable_as # A Course
has_many :same_as          # Another Course

Mag ik het volgende zeggen?

t.references :transferrable_as, :as=> :course

Antwoord 1, autoriteit 100%

U kunt dit allemaal doen in de initiële migratie/kolomdefinitie (althans momenteel in Rails 5):

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}

Antwoord 2, autoriteit 58%

Je kunt het op deze manier doen:

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as
  t.references :same_as
  t.timestamps
end

of gebruik t.belongs_toals alias voor t.references

Je kunt foreign_key: trueniet toevoegen aan die twee referentieregels. Als u ze als externe sleutels op databaseniveau wilt markeren, moet u hiermee een migratie hebben:

add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id

Bijwerken

In Rails 5.1 en hoger kunt u de externe sleutel in de migratie in het create_table-blok als volgt toevoegen:

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

Antwoord 3, autoriteit 7%

Als een toegevoegd antwoord op deze vraag — het Model zou de volgende regel moeten hebben om de koppeling te voltooien:

   belongs_to :transferrable_as, class_name: "Course"
    belongs_to :same_as, class_name: "Course"

Antwoord 4, autoriteit 7%

Ik denk dat deze thread een andere, meer Rails-achtige manier heeft:
Scaffolding ActiveRecord: twee kolommen van hetzelfde gegevenstype

Tijdens de migratie:

t.belongs_to :transferrable_as

t.belongs_to :zelfde_as


Antwoord 5

Ik denk niet dat referencesde optie :asaccepteert, maar u kunt uw kolommen handmatig maken…

create_table :courses do |t| 
  t.string  :name 
  t.integer :course1_id
  t.integer :course2_id 
  t.timestamps 
end 

Other episodes