我是否需要向has_and_belongs_to_many关系中的模型显式添加外键?

时间:2019-01-10 10:44:27

标签: ruby-on-rails activerecord associations

我有2个型号:

MY_VAR

class Supplier < ApplicationRecord
  has_and_belongs_to_many :accounts
end

我也做了一个联接表

class Account < ApplicationRecord
  has_and_belongs_to_many :suppliers
end

我的问题是我是否需要显式添加外键(supplier_id到Account,account_id到Supplier)来完成这项工作?

进入控制台并想为供应商添加一些帐户时出现错误:

  

ActiveModel :: MissingAttributeError(无法写入未知属性   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

我尝试了2种方法:

s1 = Supplier.new

s1.name =“马克”

s1.save

a1 = Account.new

a1.name =“ marc2”

a1.save

s1.account_ids = 1

s1 = Supplier.new

s1.name =“马克”

s1.accounts.create(名称:“ marc2”)

在这两种情况下,我都从顶部收到相同的错误

1 个答案:

答案 0 :(得分:0)

简短的回答是,你不是。

在《 RubyOnRails指南》中,creating join tables的ActiveRecord迁移展示了没有示例的示例,并且没有以与您类似的方式创建索引。

话虽如此,我认为迁移上有错字,因为大写的表名(即:Accounts:Suppliers甚至无法完成迁移)。查看它尝试创建的索引名称:

CREATE INDEX "index_Accounts_Suppliers_on_account_id_and_supplier_id" ON "Accounts_Suppliers" ("account_id", "supplier_id"),很清楚为什么会失败。

我在ActiveRecord更改日志(5.05.15.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

我可以毫无问题地运行您的示例。因此,这引发了一个问题:您的其他表是否已正确定义?