gpt4 book ai didi

ruby-on-rails - ActiveRecord 条件覆盖和 default_scope

转载 作者:数据小太阳 更新时间:2023-10-29 08:11:49 25 4
gpt4 key购买 nike

有什么方法可以在 where 条件下覆盖默认范围或以前的范围吗? (除了重构模型以不使用 default_scope 或使用 unscoped)

另外,为什么会这样?感觉这不是最令人期待或最直观的方法。

示例:

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

最佳答案

关于default_scope,您只需要了解一件事:不要使用它。

default_scope 就像毒品。一开始感觉很好,一切似乎都比较容易,但随着时间的推移,你会意识到使用它是一个坏主意。到那时为时已晚,您必须永远处理后果。好吧,这并不完全正确:您可以简单地停止使用 default_scope 并重写您的 Controller 以显式调用实际范围,这是您首先应该做的,因为那样一来就很明显正在检索数据,因此其他开发人员(包括将来会忘记使用 default_scope 的您)不会感到困惑。所以 default_scope 并不像吸毒那么糟糕。只是有时候会有这种感觉。

只需对 default_scope 说“不”。

关于ruby-on-rails - ActiveRecord 条件覆盖和 default_scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31466513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com