目前我有以下迁移:
class CreateDevices < ActiveRecord::Migration[5.0]
def change
create_table :devices do |t|
t.string :name
t.string :abbr
t.timestamps
end
end
end
class CreateVendors < ActiveRecord::Migration[5.0]
def change
create_table :vendors do |t|
t.string :name
t.string :abbr
t.timestamps
end
end
end
class CreateDeviceVendors < ActiveRecord::Migration[5.0]
def change
create_table :device_vendors do |t|
t.string :device
t.string :vendor
t.timestamps
end
end
end
设备和供应商之间存在多对多关系,因此DeviceVendors表正在使用它。两个表abbr列(唯一的)分别作为设备和供应商保存在此表中。
我正在使用这种表结构,以便我可以播种数据,而不必检查主表中的ID。
如何在所有三个模型中设置关联,以便我可以更好地访问。像这样:
class Device < ApplicationRecord
has_many :device_vendors
has_many :vendors, through: device_vendors
end
class Vendor < ApplicationRecord
has_many :device_vendors
has_many :devices, through: device_vendors
end
class DeviceVendor < ApplicationRecord
belongs_to :device
belongs_to :vendor
end
我知道我必须在模型中将foreign_key: :abbr
应用于belongs_to,但不确定在哪些模型中。此外,我是否需要更改/添加迁移?
答案 0 :(得分:1)
正如您所指出的,foreign_key
位于belongs_to
表上,但您需要同时指定primary_key
和foreign_key
(因为没有一个是id
class Device < ApplicationRecord
has_many :device_vendors, primary_key: "abbr", foreign_key: "device"
has_many :vendors, through: device_vendors
end
class Vendor < ApplicationRecord
has_many :device_vendors, primary_key: "abbr", foreign_key: "vendor"
has_many :devices, through: device_vendors
end
class DeviceVendor < ApplicationRecord
belongs_to :device, primary_key: "abbr", foreign_key: "device"
belongs_to :vendor, primary_key: "abbr", foreign_key: "vendor"
end
1}})在所有关联中:
abbr
另请注意,外键不是device
,这是vendor
和belongs_to
中的主键;外键是表device
中的外键(即vendor
中的device_vendors
和self.navigationController?.interactivePopGestureRecognizer?.addTarget(self, action: #selector(CountdownsViewController.handlePopGesture))
。