Rails Вопрос: принадлежат к STI - как мне сделать это правильно? - PullRequest
12 голосов
/ 17 сентября 2011

Я поиграл с отношениями STI и own_to / has_many, и я немного запутался.

У меня есть несколько вопросов, основанных на конфигурации модели, аналогичной:

class Parental < ActiveRecord::Base
end

class Mother < Parental
    has_many :babies
end

class Father < Parental
    has_many :babies
end

class Baby < ActiveRecord::Base
    belongs_to :?????? 
end
  1. Что должно Baby принадлежать?
  2. Что касается миграции, что я должен назвать / добавить для внешнего ключа на babies таблица?
  3. Мне было трудно исследовать это, есть ли определенный источник это объясняет? Документы API, кажется, не били его по голове ИЛИ я пропустил это (что вполне возможно).

Моя первая мысль - добавить parental_id к babies вместе с методом, подобным Baby#owner, который выполняет следующее:

  • Хиты self.parental
  • Определяет тип родителя
  • Возвращает правильный тип родителя (может быть мать, может быть отец)

Спасибо!

Ответы [ 2 ]

7 голосов
/ 17 сентября 2011

Baby принадлежит как Mother, так и Father

belongs_to :mother
belongs_to :father

. Вы можете иметь несколько внешних ключей.В таблице Baby DB есть два поля: mother_id и father_id

. Здесь вы найдете полное руководство по ассоциациям: http://guides.rubyonrails.org/association_basics.html

Миграция для создания класса Babyбудет выглядеть примерно так:

class CreateBabies < ActiveRecord::Migration
  def self.up
    create_table :babies do |t|
      t.integer :father_id
      t.integer :mother_id
    end
  end

  def self.down
    drop_table :babies
  end
end

Это дает вам такие вещи, как: baby.mother и baby.father.Вы не можете иметь один parental_id, потому что внешний ключ может указывать только на одну другую запись, что означает, что у детей будет только один родитель (если на самом деле их двое).

Похоже, в этом случаеТы просто неправильно понимаешь отношения, вот и все.Вы на правильном пути.

2 голосов
/ 31 августа 2016

Я сам решил похожую проблему, добавив явный вызов foreign_key.

Что-то вроде следующего кода:

class Parental < ActiveRecord::Base
end

class Mother < Parental
    has_many :babies
end

class Father < Parental
    has_many :babies
end

class Baby < ActiveRecord::Base
    belongs_to :mother, foreign_key: 'parental_id'
    belongs_to :father, foreign_key: 'parental_id'
end

Конечно, это предполагает, что у ребенка только один родитель. :-)

...