Kolomnaam specificeren in een “referentie”-migratie

Ik wil een migrationmaken 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_idin de tabel posts. Maar wat als ik in plaats van user_idiets als author_idwil? Hoe kan ik dat doen?


Antwoord 1, autoriteit 100%

Voor rails 5+

Initiële definitie:

Als u uw Post-modeltabel definieert, kunt u references, indexen foreign_keyin éé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 indexis 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.referencesdoor foreign_key: truetoe 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_idgemaakt, 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_plusjuweeltje 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)

Other episodes