Ruby on rails 如何设置与非id外键的关联?
目前我有以下迁移:Ruby on rails 如何设置与非id外键的关联?,ruby-on-rails,Ruby On Rails,目前我有以下迁移: 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
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
class CreateDevices
设备和供应商之间存在多对多关系,因此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
类设备
我知道我必须将
外键::abbr
应用于模型中的属于,但不确定在哪些模型中。此外,我是否需要为此更改/添加迁移 正如您所指出的,外键
位于归属
表中,但您需要在所有关联中同时指定主键
和外键
(因为没有一个是默认的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
类设备
还要注意外键不是
abbr
,它是设备
和供应商
中的主键;外键是表中的属于(即device
和vendor
中的vendor
)。一部分旁注,您需要索引uniq:true
设备和vendors
的abbr
列,以及设备供应商上的索引uniq:true
[:设备,:供应商]
和[:供应商,:设备]
。为了确保唯一性并加快搜索速度,这对于如何让rails处理它是正确的。但是您还应该在迁移中添加索引、主键和外键标志,以优化它并防止竞争条件。