Ruby on rails 3 默认作用域Mongomapper

Ruby on rails 3 默认作用域Mongomapper,ruby-on-rails-3,mongomapper,default-scope,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 PaymentLog

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

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

  set_collection_name "logs"

  ...

  # default scope for payment activity
end
class PaymentLog
比如这个

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

  set_collection_name "logs"

  ...

  # default scope search for suspicious activity
end
类可疑ActivityLog

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

MongoMapper不支持默认范围。如MongoMapper邮件列表中所述,当

“我个人不使用默认范围。每次我尝试,它都会咬我。”-布兰登

“我同意Brandon的观点。我从来没有让默认范围有用过。从长远来看,它总是会让你焦头烂额。最好创建一个范围/方法并始终使用该方法。”-John Nunemaker

“我和其他一些人谈过,他们似乎和我一样 约翰和布兰登的感想。我会把这封信归档 不必要:)“-哈里斯·阿明

如果您知道默认范围是解决问题的正确解决方案,则可以使用MongoMapper作为模型:

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

MongoMapper不支持默认范围。如MongoMapper邮件列表中所述,当

“我个人不使用默认范围。每次我尝试,它都会咬我。”-布兰登

“我同意Brandon的观点。我从来没有让默认范围有用过。从长远来看,它总是会让你焦头烂额。最好创建一个范围/方法并始终使用该方法。”-John Nunemaker

“我和其他一些人谈过,他们似乎和我一样 约翰和布兰登的感想。我会把这封信归档 不必要:)“-哈里斯·阿明

如果您知道默认范围是解决问题的正确解决方案,则可以使用MongoMapper作为模型:

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

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

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

因此,当我这样做时,它会覆盖默认的查询方法,
paymentLog.all
例如。@JosephLeBrech yes,MongoMapper将
all
委托给
query
,因此,它最终变成了
PaymentLog.query.all
..
query
是一个修饰的
勇敢的::query
据我所知,根本没有范围。因为当我执行
Object.first
Object.last
时,它仍然会显示相同的对象。但是我如何取消此操作?因此,这会覆盖默认的查询方法,例如,
paymentLog.all
。@JosephLeBrech是的,MongoMapper将
all
委托给
query
,因此,它最终变成了
PaymentLog.query.all
..
query
是一个修饰的
勇敢的::query
据我所知,根本没有范围。因为当我执行
Object.first
Object.last
时,它仍然会显示相同的对象。但是如何取消此范围?