gpt4 book ai didi

mysql - 将 mysql 查询转换为 rails 查询

转载 作者:行者123 更新时间:2023-11-29 02:09:14 24 4
gpt4 key购买 nike

大家好,我在将 mysql 查询转换为 rails 查询时遇到了问题。我有这些模型 -

class User < ApplicationRecord
has_many :comments, foreign_key: "commenter_id"
end

class Comment < ApplicationRecord
belongs_to :commenter, class_name: "User"
end

谁能帮我把下面的查询转换成 rails 查询-

UPDATE comments 
INNER JOIN users on comments.commenter_id = users.id
SET comments.deleted_at = users.deleted_at
WHERE users.deleted_at IS NOT NULL

我正在尝试软删除其评论者被软删除的评论。

更新 1:到目前为止,我可以通过使用这个来做到这一点-

User.only_deleted.includes(:comments).find_each do |u|
u.comments.update_all(deleted_at: u.deleted_at)
end

但我想在单个查询上执行此操作,而不必遍历结果。

更新 2:我正在使用 acts_as_paranoid gem,因此需要取消用户范围,我的最终查询变为:

User.unscoped{Comment.joins(:commenter).where.not(users: {deleted_at: nil}).update_all("comments.deleted_at = users.deleted_at") 

最佳答案

这应该适用于 MySQL:

Comment
.joins(:user)
.where.not(users: { deleted_at: nil })
.update_all("comments.deleted_at = users.deleted_at")

这在 Postgres 上不起作用,因为它缺少用户的 FROM 子句。

一个性能较低但支持多种语言的选项是:

Comment
.joins(:user)
.where.not(users: { deleted_at: nil })
.update_all("deleted_at = ( SELECT users.deleted_at FROM users WHERE comments.id = users.id )")

这仍然可能比在 Ruby 中遍历记录好一个数量级,因为您消除了应用服务器和数据库之间的流量延迟。

关于mysql - 将 mysql 查询转换为 rails 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58077137/

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