7

Mam modeluPojedynczy dziedziczenie tabeli z embeds_one mogoid

class Post 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embeds_one :comment 
end 

i muszę komentarz klasę

class Comment 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embedded_in :post 

    field :title 
    field :description 
end 

I mam innej klasy odziedziczone po komentarzu

class RecentComment < Comment 
    # certain methods 
end 

Teraz chcę aby móc utworzyć RecentComment do post, jeśli wykonam Post.last.build_comment(:_type => "RecentComment") nowy komentarz nie będzie z _type:"RecentComment", i podobnie jeśli robię Post.last.build_recent_comment, daje mi błąd mówiąc coś jak undefined method build_recent_comment for Post class. Jeśli post miałbym powinienem był bez problemu wykonać Post.last.build_comments({}, RecentComment). Ale nie wiem, jak zbudować obiekt z klasą RecentComment w tym przypadku. Jeśli ktokolwiek mógłby pomóc, to byłoby gr8!

Uwaga: Używam gem 'mongoid', '~> 2.0.1'

+0

Najprawdopodobniej wystarczy jednoznacznie wpisać każdy typ komentarza do klasy Post - embeds_one: old_comment; embeds_one: new_comment ... – monocle

+0

Myślę, że to jeden z problemów z tworzeniem podklas komentarza. Czy jest jakaś korzyść z posiadania podklas? Możesz mieć wiele klas, które są takie same, z wyjątkiem nazw. Jeśli to możliwe, możesz chcieć refaktoryzować teraz, zanim stanie się trudniejsze. W przeciwnym razie nie jestem pewien, jak utworzyć skojarzenia, które chcesz, bez wyraźnego tworzenia każdego z nich jako osadzonego dokumentu. – monocle

+1

, ale wszystkie klasy pochodne mają takie same pola i właściwości jak komentarz, więc czy będzie to właściwe, aby wszystkie z nich miały inny osadzony dokument? –

Odpowiedz

5

Może spróbuj

class Post 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embeds_one :recent_comment, :class_name => Comment 

i po prostu zrobić swoją klasę Komentarz polimorficzny

class Comment 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :type 
    validates_inclusion_of :type, :in => ["recent", "other"] 
+2

faktycznie istnieją inne klasy pochodne w komentarzach takich jak recentcomment, oldcomment i newcomment. Jeśli istniała tylko jedna klasa pochodna, to jestem pewien, że twoja odpowiedź byłaby idealna. –

1

jedną z opcji jest, aby spróbować czegoś takiego:

class RecentComment < Comment 
    store_in "comment" 

    #set the type you want 
end 

ale może po prostu używać znaczników czasu i zakres, aby odzyskać swoją ostatnią, stare komentarz new_comment i takie,

jak w klasie komentarz

scope :recent, where("created_at > (Time.now - 1.day)") 

następnie można zrobić:

post.comments.recent