Je souhaite créer une fonction 'chronologie' pour un modèle de carte existant. La Carte a déjà beaucoup de Notes et a de nombreux Attachements. Je voudrais pouvoir:Association polymorphe Rails représentant des modèles has_many existants
- notes accès, les pièces jointes (et d'autres modèles éventuellement) dans une collection unifiée avec une belle méthode comme: card.timeline
- toujours en mesure d'accéder à une carte de notes et pièces jointes comme: card.notes
- encore être en mesure d'accéder à une carte mère de note comme: note.card
- pouvoir ajouter des éléments à la chronologie de la carte, avec une API comme: carte . chronologie < < Note
Je pense que j'ai mon DB configuré correctement, il est la déclaration d'association, je ne peux pas sembler obtenir le droit. Voici mon schéma:
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
Quelqu'un sait comment je peux y parvenir en utilisant ActiveRecord? Ça me fout en l'air mentalement!
Un point de départ est:
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
Merci à l'avance ~ Stu
Je pense avoir répondu à 90% de mes propres questions ici :) Merci d'envoyer votre solution. –
Pas de problème - si j'ai raté quelque chose alors laissez-moi savoir – Stu