Ik wil een migration
maken in Rails, verwijzend naar een andere tabel. Meestal zou ik zoiets doen als:
add_column :post, :user, :references
Hiermee wordt een kolom gemaakt met de naam user_id
in de tabel posts
. Maar wat als ik in plaats van user_id
iets als author_id
wil? Hoe kan ik dat doen?
Antwoord 1, autoriteit 100%
Voor rails 5+
Initiële definitie:
Als u uw Post
-modeltabel definieert, kunt u references
, index
en foreign_key
in één regel:
t.references :author, index: true, foreign_key: { to_table: :users }
Bestaande updaten:
Als u verwijzingen naar een bestaande tabel toevoegt, kunt u dit doen:
add_reference :posts, :author, foreign_key: { to_table: :users }
Opmerking:De standaardwaarde voor index
is waar.
Antwoord 2, autoriteit 86%
In Rails 4.2+kun je ook buitenlandse sleutelsook in de db, wat een geweldig idee is.
Voor eenvoudige koppelingen kan dit ook op t.references
door foreign_key: true
toe te voegen, maar in dit geval heb je twee regels nodig.
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
Antwoord 3, autoriteit 33%
In rails 4, als je postgresql en het schema_plusjuweeltje gebruikt, kun je gewoon schrijven
add_reference :posts, :author, references: :users
Hiermee wordt een kolom author_id
gemaakt, die correct verwijst naar users(id)
.
En in uw model schrijft u
belongs_to :author, class_name: "User"
Opmerking, wanneer u een nieuwe tabel aanmaakt, kunt u deze als volgt schrijven:
create_table :things do |t|
t.belongs_to :author, references: :users
end
Opmerking: het
schema_plus
juweeltje in zijn geheel is niet compatibel met rails 5+, maar deze functionaliteit wordt aangeboden door het juweeltje schema_auto_foreign_keys(onderdeel van schema_plus) dat compatibel is met rails 5.
Antwoord 4, autoriteit 22%
Doe het handmatig:
add_column :post, :author_id, :integer
maar nu, wanneer u de instructie hoort_toe maakt, moet u deze wijzigen, dus nu moet u aanroepen
def post
belongs_to :user, :foreign_key => 'author_id'
end
Antwoord 5, autoriteit 18%
Als u geen externe sleutel gebruikt, maakt het niet uit wat de werkelijke tabelnaam van de andere tabel is.
add_reference :posts, :author
Vanaf Rails 5, als u een externe sleutel gebruikt, kunt u de naam van de andere tabel specificeren in de externe sleutelopties. (zie https://github.com/rails/rails/issues/21563voor discussie )
add_reference :posts, :author, foreign_key: {to_table: :users}
Voorafgaand aan Rails 5 moet u de externe sleutel als een aparte stap toevoegen:
add_foreign_key :posts, :users, column: :author_id
Antwoord 6
alias_attribute(nieuwe_naam, oude_naam)is erg handig.
Maak gewoon uw model en de relatie:
rails g model Post title user:references
bewerk vervolgens het model en voeg een attribuutalias toe met
alias_attribute :author, :user
Daarna kun je dingen als
. uitvoeren
Post.new(title: 'My beautiful story', author: User.first)