SQL JOIN 到 SELECT - 是否有 ActiveRecord 方法可以做到这一点?

问题描述 投票:0回答:1

我有一个这样的SQL语句。这种类型的语句完全或大部分可能在 ActiveRecord 中吗?

UPDATE users
JOIN (
  SELECT user_id, count(*) AS num
  FROM posts
  GROUP BY user_id
) AS counts ON users.id = counts.user_id
SET users.publications = counts.num
WHERE users.publications != counts.num;
  1. 如何从表“users”连接到按选定值之一分组的 SELECT 子查询的结果?

  2. 我可以为连接设置别名,以便可以比较

    users
    表和连接之间的值吗?

我很难搜索这个,因为我不知道调用 JOIN 的术语,它不是表之间的联接,而是从表到特殊格式的结果组的联接。我不认为 AR 的魔力可以解决这个问题,但我不确定。

ruby-on-rails activerecord
1个回答
1
投票

我假设您的模型是相关的,例如用户 has_many posts 和 post owns_to user。

在这种情况下,建议您添加一个名为 posts_count 的列,并将 User 中的关系更改为

has_many :posts, counter_cache: true

这将在用户模型的 posts_count 字段中保留用户帖子的计数,并在用户创建新帖子时自动更新。如果您确实需要将其称为

publications
,请将
def publications; posts_count; end
添加到用户模型中。

添加此计数器缓存时,您需要为所有现有用户初始化它。这是一次性操作,因此您可以从 Rails 控制台执行此操作,如下所示:

User.all.each{|u| u.reset_counters(u.id, :posts_count)}

© www.soinside.com 2019 - 2024. All rights reserved.