我有一个这样的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;
如何从表“users”连接到按选定值之一分组的 SELECT 子查询的结果?
我可以为连接设置别名,以便可以比较
users
表和连接之间的值吗?
我很难搜索这个,因为我不知道调用 JOIN 的术语,它不是表之间的联接,而是从表到特殊格式的结果组的联接。我不认为 AR 的魔力可以解决这个问题,但我不确定。
我假设您的模型是相关的,例如用户 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)}
。