ruby-on-rails – Rails ActiveRecord – update_all:如何使用
发布时间:2020-12-16 19:21:06 所属栏目:百科 来源:网络整理
导读:我有一个用例,我想使用ActiveRecord :: Relation update_all方法并指定几个要设置的字段.我使用update_all,因为可以更新很多条目,我不想加载它们并逐个更新它们. 其中一些需要直接的SQL SET语句,例如因为我根据另一列的值设置了一列. 是否有一个简单的语法与
我有一个用例,我想使用ActiveRecord :: Relation update_all方法并指定几个要设置的字段.我使用update_all,因为可以更新很多条目,我不想加载它们并逐个更新它们.
其中一些需要直接的SQL SET语句,例如因为我根据另一列的值设置了一列. 是否有一个简单的语法与update_all使这个可读,沿着这个=>行 MyModel.where(state: :foo).update_all([ 'timespent = timespent + 500',# Can't be anything else than a SQL statement state: :bar,# Regular Rails SQL interpolation updated_at: DateTime.current ]) 请注意,上面的语法不起作用,因为它将尝试查找占位符并替换值,因此将忽略state :: bar和updated_at:DateTime.current. 对此的部分解决方案是将所有内容转换为单个SQL语句字符串,如下所示,但我不太喜欢这个,因为我需要弄清楚SQL语句,并且在使用Rails进行编码时有点过于复杂;): MyModel.where(state: :foo).update_all([ "timespent = timespent + 500",# Can't be anything else than a SQL statement "state = 'bar'","updated_at = NOW()" # Needed to translate from Rails to PGSQL ].join(',')) 那个有优雅解决方案的人呢? 谢谢 ! 解决方法update_all 采用字符串,数组或散列(但不能混合和匹配).在数组的情况下,它需要ActiveRecord数组条件.所以你应该能够做到这样的事情:
MyModel.where(state: :foo).update_all([ 'timespent = timespent + 500,state = ?,updated_at: ?','bar',DateTime.current ]) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |