我想为现有的卡片模型创建一个“时间线”功能。卡片已经有_many Notes和has_many Attachments。我希望能够:
- 在一个统一的集合中访问笔记、附件(以及最终的其他模型),使用一种不错的方法,例如:card.timeline
- 仍然可以访问卡片的注释和附件,例如:card.notes
- 仍然可以访问笔记的父卡,例如:note.card
- 能够将项目添加到卡片的时间线,API 如下:card.timeline << note
我想我的数据库设置正确,这是我似乎无法正确的关联声明。这是我的架构:
create_table "cards", :force => true do |t|
t.string "name"
end
create_table "timeline_items", :force => true do |t|
t.integer "card_id", :null => false # FK from cards table
t.integer "item_id", :null => false # FK from notes or attachments table
t.string "item_type", :null => false # either 'Note' or 'Attachment'
end
create_table "notes", :force => true do |t|
t.text "content"
end
create_table "attachments", :force => true do |t|
t.string "file_file_name"
end
任何人都知道我如何使用 ActiveRecord 来实现这一点?它让我胡思乱想!
一个起点是:
class Card < ActiveRecord::Base
has_many :timeline_items
has_many :notes, :through => :timeline_items, :source => :item, :source_type => 'Note', :order => 'updated_at DESC'
has_many :attachments, :through => :timeline_items, :source => :item, :source_type => 'Attachment', :order => 'updated_at DESC'
end
class TimelineItem < ActiveRecord::Base
belongs_to :card
belongs_to :item, :polymorphic => true
end
class Note < ActiveRecord::Base
has_one :card, :through => :timeline_items
has_one :timeline_item, :as => :item
end
提前谢谢~Stu