有没有办法选择一个 ActiveRecord 关系进行更新?
Posted
技术标签:
【中文标题】有没有办法选择一个 ActiveRecord 关系进行更新?【英文标题】:Is there any way to select an ActiveRecord relation for update? 【发布时间】:2021-12-02 16:26:36 【问题描述】:在 Rails 6.1 中,我想选择一个关系进行更新(锁定事务中的行)。
Foo.transaction do
# this is foos_query in raw sql
ActiveRecord::Base.connection.execute <<~SQL
SELECT FROM "foos"
WHERE
type = 'bar' AND
associated_object = '#thing_id' AND
other_party_id = '#user_id'
ORDER BY id
FOR UPDATE
SQL
foos_query.update_all(read: "true", seen: true)
end
在以前的 Rails 版本中,我认为这可能会被 foos_query.lock.pluck('')
破解,但它在某个时候停止工作。
在没有原始 sql 的情况下,是否有一种受支持或 hacky 的方式来做到这一点?
相关:
How can I have rails select for update on multiple rows? https://dba.stackexchange.com/questions/257188/how-can-i-lock-rows-for-update-without-returning-data-over-the-connection【问题讨论】:
api.rubyonrails.org/classes/ActiveRecord/Locking/… @muistooshort 我认为如果不将 AR 对象加载到内存中,就无法在整个关系上做到这一点 【参考方案1】:我去了
ActiveRecord::Base.connection.execute foos_query.order(:id).lock.to_sql
另见
https://dba.stackexchange.com/questions/257188
https://dba.stackexchange.com/questions/257217
【讨论】:
以上是关于有没有办法选择一个 ActiveRecord 关系进行更新?的主要内容,如果未能解决你的问题,请参考以下文章
Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表
有没有办法反转 ActiveRecord::Relation 查询?
有没有办法在关联上调用关联时使用 ActiveRecord 而不是两个 SQL 查询?