2012-03-06 107 views
0

我有一个大屁股集合,它使用一个需要进行滤波以不同的方式默认范围Mongomapper

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字段的默认搜索。

回答

3

MongoMapper不支持默认范围。作为在MongoMapper邮件列表上的解释,当hamin wanted to discuss how to add default scopes ...

“我个人不使用默认范围,每次尝试时,它都会让我感到困扰。 - Brandon Keepers

“我同意Brandon的观点,我从来没有使用过default_scope,从长远来看,它总是会烧你,更好地创建一个范围/方法,并始终使用该方法。约翰 - Nunemaker

“我已经说过了其他几个人,他们似乎分享您的 情绪约翰和布兰登我会提交这一个消失,那么作为 不必要的:)” - 哈里斯阿明

如果您知道一个默认范围是你的问题的解决方案,你可以使用MongoMapper的Single Collection Inheritance module作为模型本事:

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

因此,当我这样做时,例如'paymentLog.all'就会覆盖默认的查询方法。 – 2012-03-08 09:09:23

+0

@JosephLeBrech是的,MongoMapper委托'all'为'query',所以它最终成为'PaymentLog.query.all' ...'query'是一个装饰的'Plucky :: Query' https://github.com/ jnunemaker/mongomapper/blob/master/lib/mongo_mapper/plugins/querying.rb#L63-70 – 2012-03-09 18:16:32

+0

是我的理解,根本没有范围。因为当我做'Object.first'或'Object.last'时,它仍会产生相同的对象。 – Trip 2012-08-14 23:08:24

2

我觉得很弱智认为MongoMa pper不支持默认范围,但仅仅是因为默认情况下它不会按任何东西对文档进行排序。 SQL数据库至少有一个自然使用的增量id。这是我认为默认范围非常重要的原因之一。