默认范围Mongomapper

时间:2012-03-06 22:09:54

标签: ruby-on-rails-3 mongomapper default-scope

我有一个大屁股集合,它使用相同的集合,需要以不同的方式过滤

class PaymentLog < ActiveRecord::Base
  include MongoMapper::Document

  set_collection_name "logs"

  ...

  # default scope for payment activity
end

例如这个。

class SuspiciousActivityLog < ActiveRecord::Base
  include MongoMapper::Document

  set_collection_name "logs"

  ...

  # default scope search for suspicious activity
end

两者都使用相同的日志,但每个都需要在type字段上进行默认搜索。

2 个答案:

答案 0 :(得分:3)

MongoMapper不支持默认范围。在hamin wanted to discuss how to add default scopes ...

时对MongoMapper邮件列表进行解释
  

“我个人不使用默认范围。每当我尝试时,它最终都会咬我。” - Brandon Keepers

     

“我同意Brandon。我从来没有使用default_scope。从长远来看,它总是会让你感到沮丧。创建一个范围/方法并且总是使用那种方法会更好。” - John Nunemaker

     

“我和其他几个人谈过,他们似乎分享了你的   情绪约翰和布兰登。我会把这个归档为   不必要:)“ - 哈里斯阿明

如果您知道默认范围是您的问题的正确解决方案,您可以使用MongoMapper的Single Collection Inheritance module作为模型来破解它:

class PaymentLog
  # ...
  def self.query(options={})
    super.tap { |query| query[:type] = "payment" unless options.key?(:type) }
  end
end

答案 1 :(得分:2)

我发现MongoMapper不支持默认作用域,但只是因为默认情况下不会按任何方式对文档进行排序。 SQL数据库至少有一个自然使用的增量id。这是我认为默认范围非常重要的一个原因。