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_to
als alias voor t.references
Je kunt foreign_key: true
niet 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 references
de optie :as
accepteert, 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