Монгоидные версии версий - PullRequest
2 голосов
/ 30 декабря 2010

Mongoid имеет встроенное управление версиями при добавлении модуля Mongoid :: Versioning. Это работает очень хорошо для меня, но я неоправданно работаю с версиями на модели. Позвольте привести пример. Предположим, я создаю приложение для блога (а я нет).

Моя модель - Пост. Допустим, я хотел найти все предыдущие опубликованные версии одного поста. Следующие работы:

post = Post.first  # just grab something
published_posts = post.versions.find_all{ |v| v.published == true }

Etc. Тогда я мог бы что-то сделать с ключом_публикации или чем-то еще. Я бы хотел сделать для этого именованную область видимости, поэтому я не помещаю блок find_all в свое представление, но не могу понять, как переопределить встроенную функциональность класса Version.

Я пробовал разные возможности в своем классе Post. Например:

# I can't get this and other variations on this to work
scope :versions_published, 
  :where => 'self.versions.find_all{ |v| v.published == true }'

Я также пытался установить исправление класса Version, но мне это не очень нравится. У меня есть обходной путь, я просто надеялся узнать больше о встроенных версиях Mongoid, особенно о расширении класса Version.

1 Ответ

1 голос
/ 31 декабря 2010

Определенная вами область действия очень и очень неправильна по двум фундаментальным причинам:

  1. Нельзя передать строку в аргумент :where.Вам нужно передать в хэш
  2. области, определенные в классе (в данном случае Post), поэтому вы не можете ссылаться на self.versions, поскольку self относится к классу Post, а не к какому-либоконкретный пост

Решение состоит в том, чтобы использовать помощник matches в Mongoid (который является ярлыком для $ elemMatch Монго ):

class Post
  #...
  scope :versions_published, where(:versions.matches => {:published => true})
  #...
end

Iне рекомендую монтировать класс Version, если вы действительно не знаете, что делаете.

...