2013-06-10 2 views
1

У меня есть основная страница модели, которая представляет собой контейнер. На странице могут быть отдельные списки, заметки, файлы и обсуждения. Идея состоит в том, чтобы иметь их в специальном порядке.Атрибут модели содержит коллекцию объекта

Page.last.container # [Todolist_obj, Note_obj, File_obj, Note_obj, Discussion_obj, File_obj, File_obj] 
  • Так я пришел подходить для использования MongoDB

  • Или я также думал об использовании Postgres с hstore, но не знаю, что это поможет или нет

  • Или возможно, просто любая база данных и десериализовать все объекты при получении страницы и сериализовать объекты при сохранении

  • Или я могу сделайте суперкласс Item и наследуйте все содержащиеся в нем объекты с помощью MTI и создайте у страницы много отношений.

Поэтому я не знаю, какой путь является лучшим?

или, возможно, есть лучший способ?

ответ

1

Я использовал acts_as_list для успешной реализации сортируемых объектов. Кроме того, я бы абстрагировал элементы страницы в отдельную модель, здесь называемую PageElement.

Я думаю, что нет необходимости переключаться на базу данных NoSQL (хотя я не имею ничего против этого подхода). Вот приблизительный эскиз того, что я думаю:

class Page < ActiveRecord::Base 
    has_many :page_elements, :order => 'position' 
    has_many :todo_lists, :through => :page_elements, :source => :element, :source_type => 'TodoList' 
    has_many :notes,  :through => :page_elements, :source => :element, :source_type => 'Note' 
    has_many :files,  :through => :page_elements, :source => :element, :source_type => 'File' 
    has_many :discussions, :through => :page_elements, :source => :element, :source_type => 'Discussion' 
end 

class PageElement < ActiveRecord::Base 
    belongs_to :page 
    belongs_to :element, :polymorphic => true 
    acts_as_list :scope => :page 
end 

class TodoList < ActiveRecord::Base 
    has_one :page_element, :as => :element 
    has_one :page, :through => :page_elements 
end 

class Note < ActiveRecord::Base 
    has_one :page_element, :as => :element 
    has_one :page, :through => :page_elements 
end 

class File < ActiveRecord::Base 
    has_one :page_element, :as => :element 
    has_one :page, :through => :page_elements 
end 

class Discussion < ActiveRecord::Base 
    has_one :page_element, :as => :element 
    has_one :page, :through => :page_elements 
end 
+0

Спасибо за ответ. Так вот, используя MTI. Почему другие не так хороши для вас? Или, вернее, почему вы предпочитаете этот путь вместо других? –

+0

Я бы * лично * придерживался подхода MTI, потому что а) это агностика базы данных, и б) это единственный подход, который я уже реализовал сам. Мне просто не нравятся базы данных NoSQL, но это просто личное предпочтение. Мой подход, безусловно, не единственное жизнеспособное решение этой проблемы. –

Смежные вопросы