有没有办法选择一个 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 选择语句的表

Rails 中的表关联 - ActiveRecord

有没有办法反转 ActiveRecord::Relation 查询?

有没有办法在关联上调用关联时使用 ActiveRecord 而不是两个 SQL 查询?

检索ActiveRecord / Rails中没有关系的对象

有没有办法在后续 Rails 3 ActiveRecord 迁移中删除 id 列?