2010-12-30 2 views
2

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

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

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

И т. Д. Затем я мог что-то сделать с опубликованными сообщениями или что-то еще. Мне бы хотелось сделать именованный параметр для этого, поэтому я не помещаю блок 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 }' 

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

ответ

1

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

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

Решение использовать matches помощник в Mongoid (который является ярлык Mongo's $elemMatch):

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

Я бы не рекомендовал monkeypatching класс Version, если вы действительно не знаете, что вы делаете.