Mongoid版本控制范围

时间:2010-12-30 19:44:29

标签: ruby-on-rails mongodb mongoid

当你混合使用Mongoid :: Versioning模块时,Mongoid有内置的版本控制。它对我来说非常好用,但是我在模型上的版本上工作得非常好。让我给你举个例子。假设我正在构建一个博客应用程序(我不是)。

我的模特是Post。假设我想找到一篇文章的所有以前发布的版本。以下作品:

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

等。然后我可以用published_posts或其他什么做点什么。我想为此创建一个命名范围,所以我不会在我的视图中放置find_all块,但我无法弄清楚如何覆盖Version类的内置功能。<​​/ p>

我在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类,但它不太喜欢它。我有一个解决方法,我只是希望了解更多关于内置的Versioning Mongoid提供的内容,特别是如何扩展Version类。

1 个答案:

答案 0 :(得分:1)

由于两个基本原因,您定义的范围非常非常错误:

  1. 您无法将字符串传递给:where参数。你需要传递哈希
  2. 范围是在课程上定义的(在本例中为Post),因此您无法引用self.versions,因为self指的是Post课程,而不是任何特定的职位
  3. 解决方案是使用Mongoid中的matches助手(这是Mongo's $elemMatch的快捷方式):

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

    我不推荐monkeypatching Version类,除非你真的知道你在做什么。