【发布时间】:2020-08-16 01:30:45
【问题描述】:
在基于Rails 5.2.4.1 的应用程序中,我们希望将default_scope 添加到应用程序中运行的所有查询中。 select 查询尊重default_scope,但update_columns、delete 和update 不尊重default_scope。
我在 rails 3.2 中找到了一个与此非常相关的 old issue,但它已在 this commit 中修复。现在在 Rails 5.2 我找不到任何可能的方法来做到这一点。
提前致谢。
【问题讨论】:
-
范围用于集合。所有提到的
update_columns、delete和update方法都是针对单个记录而不是集合调用的。在单个记录(即实例)上应用范围时的预期行为是什么? -
Model.find(id)应用默认范围。 -
是的,这需要集合。假设您有
instance = Model.unscoped.find(id),您希望在运行instance.update_columns(attribute: 'value')时如何应用默认范围?当instance符合默认范围时,预期的结果是什么?当instance不符合默认范围时,您期望什么? -
我明白你的意思。但实际上我们有
default_scope作为当前的company_Id,并且所有查询都应该有company_id,所以我们可以将特定的company_id 查询转发到它们各自的数据库。这就像基于查询的数据库分片。所以我们需要更新查询有 company_id -
default_scopes 通常是个坏主意。除非您能找到一种方法,只需一次调用即可使其项目范围广泛,那么为什么不使用自定义范围呢?你稍后会在使用 default_scopes 的大型项目中遇到问题
标签: ruby activerecord ruby-on-rails-5