Как записать ассоциацию принадлежащего к принадлежности, когда внешний ключ может ссылаться на любой из двух разных столбцов? - PullRequest
1 голос
/ 05 июня 2019

cars.dealership_id может относиться либо к dealerships.id, либо к dealerships.remote_id. Как мне написать свои ассоциации?

SCHEMA

create_table "cars", id: :serial, force: :cascade do |t|
    t.string "name", limit: 255, null: false
    t.integer "dealership_id", null: false
end

create_table "dealerships", id: :serial, force: :cascade do |t|
  t.string "name", limit: 255, null: false
  t.integer "remote_id", null: true
end

MODEL

class Car < ::ApplicationRecord
  belongs_to :dealership,
    class_name: '::Dealership',
    foreign_key: :dealership_id,
    primary_key: :remote_id

  belongs_to :dealership,
    class_name: '::Dealership',
    foreign_key: :dealership_id,
    primary_key: :id
end

Ответы [ 2 ]

1 голос
/ 05 июня 2019

cars.dealership_id может относиться к dealerships.id или dealerships.remote_id.

Я бы предположил, что этот дизайн проблематичен, и я бы рекомендовал изменить дизайн вашей базы данных следующим образом:

alter table cars
add constraint fk_cars_dealerships
foreign key (dealership_id)
references dealerships (id)
on update cascade
on delete restrict
;

С этим изменением связь становится ясной.

belongs_to :dealership
0 голосов
/ 05 июня 2019

По умолчанию create_table создаст первичный ключ с именем id. Вы можете изменить имя первичного ключа с помощью опции: primary_key (не забудьте обновить соответствующую модель) или, если вам вообще не нужен первичный ключ, вы можете передать опцию id: false.

Для создания первичного ключа, отличного от ID, вы можете использовать следующее.

class CreateContentUnits < ActiveRecord::Migration
  def change
    create_table :content_units, primary_key: :guoid do |t|
      t.boolean :active, default: false
    end
  end
end

Так что теперь guoid будет использоваться в качестве первичного ключа, и теперь вы можете использовать свой API ID в качестве идентификатора в модели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...