Как реализовать MTI в Rails, когда у parent может быть несколько дочерних типов, а child может содержать данные? - PullRequest
0 голосов
/ 31 октября 2018

Я ищу способ рельсов для реализации этого отношения класса / данных.

У меня есть следующее представление данных:

Diagram

В родительском классе есть список детей.

Каждый дочерний класс имеет некоторые данные (например, create_at, updated_at и другие данные), а также один «класс данных», к которому он может получить доступ (либо мальчик, девочка, иностранец или любой другой класс, который я хочу добавить следующим ...) .

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

Это должен быть простой случай наследования, но оказалось довольно сложно найти подходящий пример. Я читал несколько о STI (у вас есть несколько типов элементов с похожими данными, поэтому они не подходят) и MTI (у вас есть тип данных, которые могут использоваться различными типами, например сообщения, которые могут быть на группа и человек, например, тип facebook), но я не смог найти простой пример, представляющий этот тип организации данных.

Пока у меня есть Child, который содержит тип id + для указания на конкретные данные (мальчик / девочка / инопланетянин), но я в основном должен сам все управлять, используя constantize.

Есть ли лучший способ обработки наследования?

class parent < ActiveRecord::Base
  has_many :children
end

class child < ActiveRecord::Base
  belong_to :parent
  # has_one (???) -> use gettypeclass instead

  def gettypeclass
    # switch type, then constantize type and find instance id
  end
end

class boy < ActiveRecord::Base
  belong_to :child
  def process()
      # do something special
  end
end

class girl < ActiveRecord::Base
  belong_to :child
  def process()
      # do something special
  end
end

class alien < ActiveRecord::Base
  belong_to :child
  def process()
      # do something special
  end
end

# now I can do something like
parent.children.first.gettypeclass.process()

Что-то вокруг этого для данных:

create_table :parent do |t|
  t.timestamps
end

create_table :child do |t|
  t.integer :parent_id
  t.integer :data_id
  t.integer :data_type
  # some data
  t.timestamps
end

create_table :boy do |t|
  t.integer :child_id
  # some data
end

create_table :girl do |t|
  t.integer :child_id
  # some data
end

create_table :alien do |t|
  t.integer :child_id
  # some data
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...