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处理它是正确的。但是您还应该在迁移中添加索引、主键和外键标志,以优化它并防止竞争条件。