Rails ActiveRecord - наследование от базового класса без таблицы - PullRequest
19 голосов
/ 20 августа 2010

То, что я хочу сделать, - это иметь базовый класс для некоторых из моих моделей, который имеет некоторое поведение по умолчанию activerecord:

class Option < ActiveRecord::Base
  has_many :products

  def some_method
    #stuff
  end

  #etc..etc..
end

class ColorOption < Option
  #stuff...
end


class FabricOption < Option
  #stuff...
end

Тем не менее, я хочу, чтобы ColorOption и FabricOption каждая была в своих собственных таблицах,Я НЕ хочу использовать STI или иметь таблицу для базового класса «Option».Единственный способ заставить меня работать с этим - это использовать некую наследственную магию метапрограммирования.Но мне было интересно, есть ли способ сказать AR, что базовому классу не нужна таблица.Просто для дополнительного поведения и для того, чтобы поместить другие подклассы в их собственную таблицу, как обычно.

Спасибо, Крейг

Ответы [ 3 ]

54 голосов
/ 21 августа 2010

То, что вы хотите, это абстрактный класс:

class Option < ActiveRecord::Base
  self.abstract_class = true
end

class ColorOption < Option
  ...
end

class FabricOption < Option
  ...
end
17 голосов
/ 20 августа 2010

Похоже на чехол для модуля, который вы включаете.

module Option
  def self.included(base)
    base.has_many :products
  end

  # other instance methods
end

class ColorOption < ActiveRecord::Base
  include Option
  set_table_name '???' # unless ColorOption / FabricOption have same table -> move to Option module

  #stuff...

end


class FabricOption < Option
  include Option
  set_table_name '???' # unless ColorOption / FabricOption have same table -> move to Option module

  #stuff...
end

Подробнее: http://mediumexposure.com/multiple-table-inheritance-active-record/

6 голосов
/ 19 июля 2013

У меня была похожая проблема, но я также хотел изменить способ, которым AR устанавливал table_name для моих моделей, чтобы, например, модель MyProject имела имя таблицы "MY_PROJECT".

Я достиг этого, создавабстрактный класс AR, как сказал @ FFrançois, и с унаследованным методом, где я меняю имя таблицы, например:

class MyModel < ActiveRecord::Base
  self.abstract_class = true

  def self.inherited(subclass)
    subclass.table_name = subclass.name.underscore.upcase
  end
end

class MyProject < MyModel
end

Теперь MyProject.table_name дает MY_PROJECT:)

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