1

我有主模型 Page,它是容器。该页面可以有一些待办事项列表、注释、文件和讨论。我们的想法是让它们按特殊顺序排列。

Page.last.container # [Todolist_obj, Note_obj, File_obj, Note_obj, Discussion_obj, File_obj, File_obj] 
  • 所以我开始接近使用Mongodb

  • 或者我也想过在hstore中使用Postgres,但不知道它是否有帮助

  • 或者可能只是任何数据库并在获取页面时反序列化所有对象,并在保存时序列化对象

  • 或者我可以使用 MTI 制作超类 Item 并从中继承所有包含的对象,并使 Page 有很多关系。

所以我不知道哪种方式最好?

或者也许有更好的方法?

4

1 回答 1

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
于 2013-06-10T19:19:02.973 回答