既存のカードモデルの「タイムライン」機能を作成したいと思います。カードにはすでにhas_manyNotesとhas_manyAttachmentsがあります。次のことができるようになりたい:
- card.timelineのような優れた方法で、統合されたコレクション内のメモ、添付ファイル(および最終的には他のモデル)にアクセスします。
- 引き続き、card.notesのようなカードのメモや添付ファイルにアクセスできます。
- 引き続き、note.cardのようなメモの親カードにアクセスできます。
- 次のようなAPIを使用して、カードのタイムラインにアイテムを追加できます。card.timeline << note
DBが正しく設定されていると思いますが、これは関連付けの宣言であり、正しく設定されていないようです。これが私のスキーマです:
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