Связи Rails "один ко многим": определение поля внешнего ключа при формировании шаблонов? - PullRequest
0 голосов
/ 12 июля 2020

Мне нужно определить ассоциацию «один ко многим» в Rails. Например, например, «Поставщик» и «Артикул» (у одного поставщика много статей).

Необходимо ли иметь поле внешнего ключа «vendor_id: int» в «Артикуле» при построении шаблонов?

Или достаточно определить ассоциации позже в модельных классах «Поставщик» и «Артикул»?

Означает: «Артикул» -класс получает оператор «принадлежит_классу: поставщик» и «поставщик» получает оператор «has_many: статьи».

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Не обязательно иметь foreign_key в article таблице, но она должна быть у вас. Код для создания скаффолда должен быть таким, как показано ниже

rails g scaffold article vendor:references field1:datatype field2:datatype ...

. Он будет генерировать миграцию рельсов с оператором create для таблицы article. Он будет иметь foreign_key, т.е. vendor_id, как показано ниже

class CreateArticles < ActiveRecord::Migration[5.1]
  def change
    create_table :articles do |t|
      t.references :vendor, foreign_key: true
      .....other fields

      t.timestamps
    end
  end
end

Если вы не хотите forign_key, вы можете удалить foreign_key из миграции

belongs_to :vendor будет автоматически добавлено в модели article.

1 голос
/ 12 июля 2020

Необходимо? Нет. Мы все еще можем использовать приведенный ниже код в миграциях rails 5:

add_reference :article, :vendor, foreign_key: true

, но мы также можем иметь некоторый контроллер magi c для «связи» без ссылок. Единственная проблема в том, что нам все равно придется где-то хранить реляционный идентификатор. Например, если вам нужна ссылка без внешнего ключа для индекса, напишите в контроллере статьи следующее:

def index
    @vendor = Vendor.find(params[:vendor_id]) if params[:vendor_id]
    ## do stuff with vendor object
end

Это правильный способ сделать это? Если вам абсолютно необходимо избегать использования внешнего ключа, это один из способов достижения того же результата. Где вы храните и отправляете параметры для отношения id, зависит от разработчика.

...