Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 有没有办法在rails中添加带有更新列和删除列的默认范围_Ruby_Activerecord_Ruby On Rails 5 - Fatal编程技术网

Ruby 有没有办法在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

在基于Rails的应用程序
5.2.4.1
中,我们希望向应用程序中运行的所有查询添加
default\u scope
<代码>选择查询涉及的是
默认范围
,但
更新列
删除
更新
不涉及
默认范围

我在rails
3.2
中发现了一个与此非常相关的问题,但它已在中修复。现在在Rails
5.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]]