我有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”)
在这两种情况下,我都从顶部收到相同的错误
答案 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.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
我可以毫无问题地运行您的示例。因此,这引发了一个问题:您的其他表是否已正确定义?