gpt4 book ai didi

ruby-on-rails - 如何基于 Rails 中的子查询 `update_all`

转载 作者:行者123 更新时间:2023-12-04 05:56:12 24 4
gpt4 key购买 nike

我试图在 PostgreSQL 中以 Rails 方式实现一些非常简单的东西。

假设您有一个 User 3 列模型 id , cached_segment , cached_step .
假设您已经有一个计算 segment 的复杂查询。和 query运行中,封装在范围内 User.decorate_with_segment_and_step .这将返回 ActiveRecord关系,同 User ,但还有 3 个额外的列:

id  cached_segment cached_step segment    step    cache_invalid
1 NULL NULL segment_1 step_1 TRUE
2 segment_1 step_2 segment_1 step_2 FALSE
3 ...

我想生成的 SQL 如下(PostgreSQL 风格):
UPDATE users
SET cached_segment = segment_1
cached_step = step
FROM (#{User.decorate_with_segment_and_step.to_sql}) decorated_users
WHERE decorated_users.cache_invalid AND decorated_users.id = users.id

理想情况下,我可以做类似的事情
User.
from(User.decorate_with_segment_and_step, 'decorated_users').
where(cache_invalid: true).
update_all('cached_segment = segment, cached_step = step')

我对上面的陈述不满意, update_all ,根据源代码,简单地丢弃 from构建更新语句时的子句。

注意:我知道我可以只使用 User.connection.execute(my_raw_sql_here) ,这就是我现在正在做的事情。目标是坚持使用 ActiveRecord。

最佳答案

是的,AR 有其局限性,但这不是其中之一。假设您将 Postgres 用于所有事情——开发、测试和生产——你的咒语是:

ActiveRecord::Base.connection.execute("UPDATE users SET cached_segment = segment_1, cached_step = step FROM (#{User.decorate_with_segment_and_step.to_sql}) decorated_users WHERE decorated_users.cache_invalid AND decorated_users.id = users.id")

希望能帮助到你...

关于ruby-on-rails - 如何基于 Rails 中的子查询 `update_all`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52205719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com