Tôi đã sử dụng act_as_list
để triển khai các đối tượng có thể sắp xếp rất thành công. Ngoài ra, tôi sẽ trừu tượng hóa các phần tử của một trang thành một mô hình riêng biệt, ở đây được gọi là PageElement
.
Tôi nghĩ rằng không cần phải chuyển sang cơ sở dữ liệu NoSQL (mặc dù tôi không có gì chống lại cách tiếp cận này). Đây là bản phác thảo sơ bộ về những gì tôi đang nghĩ:
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