Как наследовать от моделей в Rails, где один тип расширяет другой без переплетения - PullRequest
2 голосов
/ 11 февраля 2012

Мне известно о количестве сообщений на эту тему, но я все еще не могу понять, как это сделать. У меня есть модель "InspirationItem", которая в основном представляет собой сообщения в блоге. Теперь я тоже хочу вторую модель, «Специальную». Специальные предложения, как элементы вдохновения, но у них есть дополнительные свойства, такие как «выдержка» и «тема». Поэтому я хочу расширить модель «InspirationPost».

Я пытался создать модель "Post", которую расширяют и InspirationItem, и Special, но InspirationItem действительно не добавляет никаких свойств. Затем я создаю отношение «has_one» из InspirationItem / Special и пытаюсь использовать «делегат» для обработки всех логик в модели «Post». Однако это не работает так, как я ожидал.

Вот мой код. Это был бы мой InspirationItem:

class InspirationItem < ActiveRecord::Base
    has_one :post, :as => :item

    delegate            :title, :title=,
                        :body, :body=,
                        :category_names, :category_names=,
                        :hide_from_overview, :hide_from_overview=,
                        :to => :post, :allow_nil => true

end

А это короткая версия сообщения:

class Post < ActiveRecord::Base

    attr_accessible :title, :body, :embed, :hide_from_overview, :visual, :thumbnail, :category_names
    # All sorts of logics
end

Важно то, что я не хочу, чтобы InspirationItem.all тоже возвращал Specials, поэтому я использую модель Post. Я также хочу, чтобы обычная обработка ошибок работала для всех моделей. Заранее спасибо!

1 Ответ

2 голосов
/ 11 февраля 2012

Если вам нужен подкласс ActiveRecord модели, но вы не хотите, чтобы родительский объект выполнял поиск среди дочерних элементов, тогда должно сработать что-то подобное (я буду использовать ваш класс InspirationItem):

class InspirationItem < ActiveRecord::Base
  def self.descendants
    super.reject {|klass| klass == Special}
  end
end

class Special < InspirationItem
end

Это немного странно, но заставит ActiveRecord возвращать InspirationItems только при поиске InspirationItem.all. И это не должно влиять на проверки.

РЕДАКТИРОВАТЬ: Re: Как таблицы будут выглядеть для этого.

create_table :inspiration_items do |t|
  t.string :type # needed for the Single Table Inheritance mechanism
  # whatever other columns you need for InspirationItems
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...