如何使用非id外键设置关联?

时间:2017-06-16 13:38:14

标签: 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 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,但不确定在哪些模型中。此外,我是否需要更改/添加迁移?

1 个答案:

答案 0 :(得分:1)

正如您所指出的,foreign_key位于belongs_to表上,但您需要同时指定primary_keyforeign_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,这是vendorbelongs_to中的主键;外键是表device中的外键(即vendor中的device_vendorsself.navigationController?.interactivePopGestureRecognizer?.addTarget(self, action: #selector(CountdownsViewController.handlePopGesture))