Рельсы ссылаются на 2 столбца из другой модели - PullRequest
1 голос
/ 24 февраля 2020

Я уже видел это, но я не уверен, как применить это в моей конкретной ситуации Как добавить миграцию с несколькими ссылками на одну и ту же модель в одной таблице? Ruby / Rails

Я пытаюсь найти способ, чтобы модель с именем ChildOrganization ссылалась на 2 столбца из другой модели с именем Organization в отношении один-ко-многим в Rails 4.2 веб-приложение.

Например, org1 и org2 оба перечислены в модели Организации и имеют столбцы, такие как имя, адрес и т. Д. c ... но в модели ChildOrganization org1_id и org2_id должны быть перечислены в разделе «родитель» и столбцы 'child', чтобы создать пару родитель / потомок. Цель состоит в том, чтобы иметь модель ChildOrganization, которая перечисляет пары двойок из модели организации.

ChildOrganization имеет справочный столбец с именем organization_id, который ссылается на таблицу Organization, а другой столбец, который просто принимает целое число с именем child_organization_id

в модели организации (приведенное ниже неверно)

has_many :child_organizations, class_name: "ChildOrganization", foreign_key: "organization_id", dependent: :destroy
has_many :child_organizations, class_name: "ChildOrganization", foreign_key: "child_organization_id", dependent: :destroy

в модели ChildOrganization

belongs_to :organization

ОБНОВЛЕНИЕ

Вот что сработало. В модели organization у меня ниже. Ассоциации могут называться как угодно, они не являются именами моделей \ таблиц. Вы определяете модель с помощью class_name

  # child_organization_parents/children associations map to foreign keys in the ChildOrganization table
  has_many :child_organization_parents, class_name: "ChildOrganization", foreign_key: "parent_org_id", dependent: :destroy
  has_many :child_organization_children, class_name: "ChildOrganization", foreign_key: "child_org_id", dependent: :destroy

в ChildOrganization модели

  belongs_to :organization

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

create_table :child_organizations do |t|
  t.integer :parent_org_id, null: false, index: true
  t.integer :child_org_id, null: false, index: true

  t.timestamps null: false
end

вот команда, которую я использовал для создания модели, которая будет содержать 2 внешних ключа, не забудьте добавить null: false и index: true в файл миграции перед его запуском.

rails g model ChildOrganization parent_org_id:integer child_org_id:integer --no-assets --no-test-framework

1 Ответ

1 голос
/ 25 февраля 2020

Этот первый аргумент после has_many должен быть другим.

Примерно так:

has_many :child_organization_organizations, class_name: "ChildOrganization", foreign_key: "organization_id", dependent: :destroy
has_many :child_organization_child_organizations, class_name: "ChildOrganization", foreign_key: "child_organization_id", dependent: :destroy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...