наследование одной таблицы с помощью embeds_one mogoid - PullRequest
7 голосов
/ 11 мая 2011

У меня есть модель

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

  embeds_one :comment
end

, и у меня есть класс комментариев

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

  embedded_in :post

  field :title
  field :description
end

И у меня есть другой класс, унаследованный от комментария

class RecentComment < Comment
  # certain methods
end

Теперь я хочучтобы иметь возможность создать от RecentComment до post, если я сделаю Post.last.build_comment(:_type => "RecentComment"), новый комментарий не будет иметь _type:"RecentComment", и аналогично, если я сделаю Post.last.build_recent_comment, он выдаст мне ошибку, говорящую что-то вроде undefined method build_recent_comment for Post class.Если бы у post было references_many :comments, я бы без проблем выполнил Post.last.build_comments({}, RecentComment).Но я не знаю, как построить объект с классом RecentComment в этом случае.Если бы кто-нибудь мог помочь, это было бы gr8!

Примечание: я использую gem 'mongoid', '~> 2.0.1'

Ответы [ 2 ]

5 голосов
/ 21 мая 2011

Возможно, попробуйте

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

  embeds_one :recent_comment, :class_name => Comment

и просто сделайте свой класс комментариев полиморфным

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

  field :type
  validates_inclusion_of :type, :in => ["recent", "other"]
1 голос
/ 05 августа 2011

один из вариантов - попробовать что-то вроде:

class RecentComment < Comment
  store_in "comment"

  #set the type you want
end

, но вы можете просто использовать метки времени и область видимости, чтобы получить свой недавний, старый комментарий, новый_комментарий и т. П.,

, как в комментариикласс

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

тогда можно сделать:

post.comments.recent
...