Ruby on rails 4 为什么赢了';当这些嵌套的非作用域块在Rails 3中工作时,它们是否可以删除Rails 4中的默认作用域?

Ruby on rails 4 为什么赢了';当这些嵌套的非作用域块在Rails 3中工作时,它们是否可以删除Rails 4中的默认作用域?,ruby-on-rails-4,ruby-on-rails-3.2,eager-loading,nested,default-scope,Ruby On Rails 4,Ruby On Rails 3.2,Eager Loading,Nested,Default Scope,我的问题 看起来Rails 4忽略了嵌套的非范围块(而Rails 3中的块是ok的)。我一直在谷歌上疯狂搜索,在这里找不到任何变化的迹象。有没有办法让它在Rails 4中工作 我在做什么 def scoping previous, klass.current_scope = klass.current_scope, self yield ensure klass.current_scope = previous end def scoping @klass.with_scope

我的问题

看起来Rails 4忽略了嵌套的非范围块(而Rails 3中的块是ok的)。我一直在谷歌上疯狂搜索,在这里找不到任何变化的迹象。有没有办法让它在Rails 4中工作

我在做什么

def scoping
  previous, klass.current_scope = klass.current_scope, self
  yield
ensure
  klass.current_scope = previous
end
def scoping
  @klass.with_scope(self, :overwrite) { yield }
end
我正在使用多租户的默认范围,如中所示。一些管理员将是多个租户的管理员,我想在报告中向他们显示聚合数据。我是通过使用。我也在预加载关联对象,因为1)它更有效,2)我需要在一个位置获取所有关联对象,这样我就不必在视图中继续使用未缩放的块。要预加载关联的对象,我使用嵌套的未缩放块

我在Rails 3.2.17上的应用程序中使用了这个功能,但现在我已经升级到Rails 4.0.1.rc1,它不再工作了

一个简单的例子来说明差异

def current_scope #:nodoc:
  ScopeRegistry.value_for(:current_scope, base_class.to_s)
end
下面,我将展示我在控制台中得到的内容。这个例子比我实际想做的要简单得多,但我认为这是显示发生了什么的最简单的方法

Loading development environment (Rails 3.2.17)
1.9.3-p374 :001 > s = nil
   => nil 
1.9.3-p374 :002 > Submission.unscoped { Checklist.unscoped { s = Submission.preload(:checklist).find(3269) }}
  Submission Load (27.8ms)  SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 LIMIT 1  [["id", 3269]]
  Checklist Load (0.6ms)  SELECT "checklists".* FROM "checklists" WHERE "checklists"."id" IN (17)
 => #<Submission id: 3269, user_id: nil, workday_id: 17, checklist_id: 17, note: nil, submitted: false, submitted_at: nil, created_at: "2014-03-12 01:06:03", updated_at: "2014-03-12 01:06:03", for_date: "2014-03-11", tenant_id: 2, position: 1, department_id: nil, status: "blank"> 
1.9.3-p374 :003 > s
 => #<Submission id: 3269, user_id: nil, workday_id: 17, checklist_id: 17, note: nil, submitted: false, submitted_at: nil, created_at: "2014-03-12 01:06:03", updated_at: "2014-03-12 01:06:03", for_date: "2014-03-11", tenant_id: 2, position: 1, department_id: nil, status: "blank"> 
1.9.3-p374 :004 > s.checklist
 => #<Checklist id: 17, name: "Open", description: "Chores Required To Open Store Front", creator_id: 2, created_at: "2013-09-23 21:55:23", updated_at: "2013-09-23 21:55:23", archived: false, archived_at: nil, ancestry: nil, tenant_id: 2>
关系。范围界定

def scoping
  previous, klass.current_scope = klass.current_scope, self
  yield
ensure
  klass.current_scope = previous
end
def scoping
  @klass.with_scope(self, :overwrite) { yield }
end
当前\u范围

def current_scope #:nodoc:
  ScopeRegistry.value_for(:current_scope, base_class.to_s)
end

关系。范围界定

def scoping
  previous, klass.current_scope = klass.current_scope, self
  yield
ensure
  klass.current_scope = previous
end
def scoping
  @klass.with_scope(self, :overwrite) { yield }
end
链接到方法

def with_scope
  # Pretty long and involved method
  # See Line 60 in the linked doc
end

看起来我遇到了一个Rails 4错误。据我所知,在Rails 4中,目前不可能同时使用unscoped和eager加载,因为“unscoped”基本上没有嵌套或链接

以下是Github的问题:

我最终(现在)要做的是在我需要的地方创建无范围的关联(现在在Rails 4中可用)。下面是一个示例(来自我在Github问题中添加的要点):

将返回提交,但随后调用Submission.unscoped_checklist将返回零


因此,我目前无法急切地加载非范围关联,但我已经找到了在需要时如何访问非范围关联的方法。

我在一个基于Spree的Rails项目中遇到了同样的问题,并在实施此拐杖之前经历了一系列失败的方法:

与其他方法相比,我更喜欢这种方法,因为它不涉及猴子修补或任何其他聪明的技巧。它只是清除(并随后恢复)
默认\u范围
数组

在我的项目中,将该文件放到
lib/default\u scope\u crutch.rb
中,然后用如下内容包装我的代码:

disable_default_scopes(Product, User) {
  @orders = Order.preload(:product, :user).page(1).per(10)
  @orders.load
}

我更希望使用ActiveRecord提供的方法来实现这一点,但我不知道有这样的方法。希望这对其他遇到这个问题的人有用。

这个@josh?@SteveRobinson有什么好运气吗。我正在使用变通方法,但底线是我现在无法预加载未加载的内容。希望他们正在努力,但Github问题最近没有太多行动。
disable_default_scopes(Product, User) {
  @orders = Order.preload(:product, :user).page(1).per(10)
  @orders.load
}