Ruby 有没有办法在rails中添加带有更新列和删除列的默认范围
在基于Rails的应用程序Ruby 有没有办法在rails中添加带有更新列和删除列的默认范围,ruby,activerecord,ruby-on-rails-5,Ruby,Activerecord,Ruby On Rails 5,在基于Rails的应用程序5.2.4.1中,我们希望向应用程序中运行的所有查询添加default\u scope选择查询涉及的是默认范围,但更新列、删除和更新不涉及默认范围 我在rails3.2中发现了一个与此非常相关的问题,但它已在中修复。现在在Rails5.2中,我找不到任何可能的方法来实现这一点 提前感谢。Rails 6.1所有查询:true默认范围选项 : 在Rails 6.1之前,如果在模型中定义了默认范围,那么它将仅应用于选择和插入查询。Rails 6.1添加了一个选项all\u q
5.2.4.1
中,我们希望向应用程序中运行的所有查询添加default\u scope
<代码>选择查询涉及的是默认范围
,但更新列
、删除
和更新
不涉及默认范围
我在rails3.2
中发现了一个与此非常相关的问题,但它已在中修复。现在在Rails5.2
中,我找不到任何可能的方法来实现这一点
提前感谢。Rails 6.1所有查询:true
默认范围选项
:
在Rails 6.1之前,如果在模型中定义了默认范围
,那么它将仅应用于选择
和插入
查询。Rails 6.1添加了一个选项all\u querys:true
,该选项可以传递给default\u scope
,以使作用域适用于所有查询
default_scope->{where(…)},所有_查询:true
考虑下面的Article类
类文章
默认\u范围->{where(组织\u id:Current.organization\u id)}
结束
@更新标题:“你好,世界”
@第条.删除
update
和delete
方法将生成如下所示的SQL查询。我们可以看到,这些查询中缺少default\u范围
在Rails 6.1中,我们可以通过将所有查询:true
传递到默认范围来解决这个问题
类文章
默认\u范围->{where(organization\u id:Current.organization\u id)},所有\u查询:true
结束
然后,生成的SQL将更改为:
资料来源:
-
-
Rails 6.1所有查询:true
默认范围选项
:
在Rails 6.1之前,如果在模型中定义了默认范围
,那么它将仅应用于选择
和插入
查询。Rails 6.1添加了一个选项all\u querys:true
,该选项可以传递给default\u scope
,以使作用域适用于所有查询
default_scope->{where(…)},所有_查询:true
考虑下面的Article类
类文章
默认\u范围->{where(组织\u id:Current.organization\u id)}
结束
@更新标题:“你好,世界”
@第条.删除
update
和delete
方法将生成如下所示的SQL查询。我们可以看到,这些查询中缺少default\u范围
在Rails 6.1中,我们可以通过将所有查询:true
传递到默认范围来解决这个问题
类文章
默认\u范围->{where(organization\u id:Current.organization\u id)},所有\u查询:true
结束
然后,生成的SQL将更改为:
资料来源:
-
-
作用域用于收集。所有提到的update\u列
、delete
和update
方法都在单个记录上调用,而不是在集合上调用。在单个记录或实例上应用作用域时,预期的行为是什么?Model.find(id)
应用默认作用域。是的,在集合上调用该作用域。假设您有instance=Model.unscoped.find(id)
在运行instance.update\u列(属性:“value”)
时,您希望如何应用默认范围?当实例
符合默认范围时,预期的结果是什么?当实例
不符合默认范围时,您预期的结果是什么?我明白您的意思。但实际上,我们有默认范围
作为当前公司Id,所有查询都应该有公司Id,这样我们就可以将特定的公司Id查询转发到各自的数据库。这就像基于查询的数据库切分。因此,我们需要更新查询以使company\u iddefault\u作用域通常不是一个好主意。除非您能找到一种方法,只需一次调用就可以将其扩展到整个项目,那么为什么不使用自定义范围呢?稍后,在具有默认范围的大型项目中,您会遇到问题。范围用于集合。所有提到的update\u列
、delete
和update
方法都在单个记录上调用,而不是在集合上调用。在单个记录或实例上应用作用域时,预期的行为是什么?Model.find(id)
应用默认作用域。是的,在集合上调用该作用域。假设您有instance=Model.unscoped.find(id)
在运行instance.update\u列(属性:“value”)
时,您希望如何应用默认范围?当实例
符合默认范围时,预期的结果是什么?当实例
不符合默认范围时,您预期的结果是什么?我明白您的意思。但实际上,我们有默认范围
作为当前公司Id,所有查询都应该有公司Id,这样我们就可以将特定的公司Id查询转发到各自的数据库。这就像基于查询的数据库切分。因此,我们需要更新查询以使company\u iddefault\u作用域通常不是一个好主意。除非您能找到一种方法,只需一次调用就可以将其扩展到整个项目,那么为什么不使用自定义范围呢?稍后,在具有默认\u作用域的大型项目中,您将遇到问题
UPDATE "articles" SET "title" = $1 WHERE "articles"."id" = $2 [["title", "Hello World"], ["id", 146]]
DELETE FROM "articles" WHERE "articles"."id" = $1 [["id", 146]]
UPDATE "articles" SET "title" = $1 WHERE "articles"."id" = $2 AND "articles"."organization_id" = $3 [["title", "Hello World"], ["id", 146], ["organization_id", 314]]
DELETE FROM "articles" WHERE "articles"."id" = $1 AND "articles"."organization_id" = $2 [["id", 146], ["organization_id", 314]]