Создает ли в структуре has_many и own_to ActiveRecord операторы alter sql. sql? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть такой код

class Author < ApplicationRecord
  has_many :books, dependent: :destroy
end

class Book < ApplicationRecord
  belongs_to :author
end

При создании создания миграции я не использовал ни одного ключевого слова для создания ассоциаций внешних ключей. Но я вижу заявление alter sql относительно добавления внешнего ключа в структуру. sql. Как и почему?

1 Ответ

3 голосов
/ 24 марта 2020

Простая установка ассоциаций в вашей модели НЕ изменяет схему в любом случае, и этот код выдаст неопределенную ошибку столбца, если вы фактически не создадите столбец books.author_id посредством миграции.

Запуск генератор модели с author:belongs_to или author:references (которые являются псевдонимами) действительно добавляет столбец внешнего ключа к миграции, а также ассоциацию belongs_to :author в модели.

# rails g model book title:string author:belongs_to
class CreateBooks < ActiveRecord::Migration[6.0]
  def change
    create_table :books do |t|
      t.string :title
      t.belongs_to :author, null: false, foreign_key: true
      t.timestamps
    end
  end
end

Но ассоциация не на самом деле должно быть ограничение внешнего ключа . Если вы запустили генератор с author_id:bigint, ассоциация будет работать, но у вас не будет ограничения внешнего ключа для гарантии ссылочной целостности.

Использование books:has_many с другой стороны в генераторе вызовет плохую миграцию, так как has_many ассоциация не является столбцом базы данных.

...