【发布时间】:2015-07-17 00:05:52
【问题描述】:
有没有办法在 where 条件下覆盖默认范围或以前的范围? (除了重新构建模型以不使用default_scope 或使用无作用域)
另外,为什么会这样工作的原因是什么?感觉这不是最令人期待或最直观的方法。
示例:
class Product < ActiveRecord::Base
default_scope -> { visible }
scope :visible, -> { where(visible: true) }
scope :hidden, -> { where(visible: false) }
end
当我这样做时:
Product.hidden
生成的 sql 尝试匹配两个值:
WHERE "products"."visible" = 't' AND "products"."visible" = 'f'
没有 default_scope 也是如此:
class Product < ActiveRecord::Base
scope :visible, -> { where(visible: true) }
scope :hidden, -> { where(visible: false) }
end
当我这样做时:
Product.visible.where(visible: false)
或者当我这样做时:
Product.visible.hidden
生成的 sql 尝试匹配两个值:
WHERE "products"."visible" = 't' AND "products"."visible" = 'f'
我用一个完整的测试用例提出了这个要点:https://gist.github.com/mmontossi/dcf71457e98a169c28a5
当我第一次问这个问题时,我认为这是一个错误: https://github.com/rails/rails/issues/20907#issuecomment-122131096
【问题讨论】:
-
要点没有解释所需的行为?
-
与stackoverflow.com/questions/1834159/… 重复的问题。这个问题的答案有很好的解释
-
我刚刚编辑了这个问题,我想找出为什么会这样的原因。感觉很奇怪,但也许这是保持这种状态的好理由。
-
您链接的问题非常好,但我没有找到有关为什么这样设计的信息。
-
它做你想做的事。您声明了默认范围。默认范围每次都运行(不包括您使用无范围的)。这就是为什么默认范围真的很难看的原因。它们每次都会被执行,在这种情况下它似乎没用,但你对你的代码负责。
标签: ruby-on-rails ruby activerecord