При создании дочерней таблицы в Rails нужно ли указывать родительский ключ или ассоциация сделает это автоматически для вас? - PullRequest
0 голосов
/ 09 октября 2019

Не могу поверить, что я до сих пор не знаю этого ... если я создаю новую таблицу Fruit, принадлежащую родителю Basket, я должен написать это в файле миграции:

create_table :fruits do |t|
  t.integer :basket_id
  ...
end

Или этого достаточно:

create_table :fruits do |t|
  t.belongs_to :basket
  ...
end

Конечно, файлы модели будут настроены соответствующим образом:

class Fruit
  belongs_to :basket
end

class Basket
  has_many :fruits
end

Или это зависит от версии и/ или обстоятельства (например, на самом деле есть фундаментальные различия между тем или иным способом, например, я могу видеть, где, если вы укажете belongs_to в таблице, то, возможно, rails автоматически создаст проверку: validates :basket_id, presence: true для Fruit)

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Если вы создаете ассоциацию has_many, belongs_to в таблице / миграции для belongs_to, вам нужно как-то указать ей, чтобы хранить идентификатор has_many.

Inваш пример, в таблице фруктов / миграции, вы должны сказать, что вам нужен basket_id. Есть несколько способов сделать это. Вы уже обнаружили два из них:

t.integer :basket_id
t.belongs_to :basket_id

Существует также третий способ:

t.references :basket

Они все делают одно и то же. Пока у вас есть basket_id в таблице фруктов / миграции, все будет в порядке.

Еще одна вещь, которую вы можете захотеть сделать, если это еще не было сделано с миграцией, это добавить foreign_key. Вы можете сделать это, добавив foreign_key: true:

t.references :basket, foreign_key: true

Это сообщит фруктовой таблице, что basket_id - это Foreign_key, по сути, ключ от другой таблицы (таблицы корзины).

0 голосов
/ 09 октября 2019

Если вы посмотрите в исходном коде assign_to на самом деле является псевдонимом ссылок.

В Rails 5 всякий раз, когда мы определяем ассоциацию own_to, требуется наличие соответствующей записи. по умолчанию. Хотя есть способы отключить это.

Чтобы отключить это поведение для конкретной ассоциации:

belongs_to :user, optional: true

Чтобы отключить все приложение:

Rails.application.config.active_record.belongs_to_required_by_default = false

Это можно добавить в файл application.rb.

Чтобы лучше понять эту статью , статья .

Однако в Rails 4, например, даже если вы добавляете t. Проверка модели принадлежат_ не будет по умолчанию. Вам необходимо добавить:

belongs_to :user, required: true

belongs_to или references для ограничений внешнего ключа и целостности базы данных, а не для проверок модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...