Нужно ли явно добавлять внешний ключ в модели в отношении has_and_belongs_to_many? - PullRequest
0 голосов
/ 10 января 2019

У меня есть 2 модели:

class Supplier < ApplicationRecord
  has_and_belongs_to_many :accounts
end

и

class Account < ApplicationRecord
  has_and_belongs_to_many :suppliers
end

Я также сделал таблицу соединений

class CreateJoinTableAccountSupplier < ActiveRecord::Migration[5.0]
  def change
    create_join_table :Accounts, :Suppliers do |t|
      t.index [:account_id, :supplier_id]
      t.index [:supplier_id, :account_id]
    end
  end

У меня вопрос: нужно ли явно добавлять внешние ключи (supplier_id для Account и account_id для Supplier), чтобы получить эту работу?

Когда переходите на консоль и хотите добавить несколько аккаунтов для поставщиков, появляется ошибка:

ActiveModel :: MissingAttributeError (невозможно записать неизвестный атрибут id)

Я пробовал это двумя способами:

s1 = Supplier.new

s1.name = "Marc"

s1.save

a1 = Account.new

a1.name = "marc2"

a1.save

s1.account_ids = 1

и

s1 = Supplier.new

s1.name = "Marc"

s1.accounts.create (имя: "marc2")

В обоих случаях я получил одинаковую ошибку сверху

1 Ответ

0 голосов
/ 10 января 2019

Короткий ответ - нет, не знаешь.

В руководствах RubyOnRails миграции ActiveRecord для создания таблиц объединения демонстрируют примеры без них и индексы, создаваемые аналогично вашим.

При этом я предполагаю, что в миграции есть опечатка, так как имена таблиц с заглавными буквами (то есть: :Accounts и :Suppliers даже не завершат миграцию). Посмотрите имя индекса, которое он пытается создать:

CREATE INDEX "index_Accounts_Suppliers_on_account_id_and_supplier_id" ON "Accounts_Suppliers" ("account_id", "supplier_id") и становится понятно, почему это не получается.

Я не увидел соответствующих изменений в журналах изменений ActiveRecord ( 5.0 , 5.1 и 5.2 ), но делал это следующим образом:

class CreateBaseTables < ActiveRecord::Migration[5.2]
  def change
    create_table :suppliers do |t|
      t.string :name
    end

    create_table :accounts do |t|
      t.string :name
    end

  end
end

class CreateJoinTable < ActiveRecord::Migration[5.2]
  def change
    create_join_table :accounts, :suppliers do |t|
      t.index [:account_id, :supplier_id]
      t.index [:supplier_id, :account_id]
    end
  end
end

Я могу запустить ваш пример без проблем. Так что возникает вопрос: правильно ли определены другие ваши таблицы?

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