目前我有这个查询来拉动所有拥有头像的用户:
@users = User.all.order('RANDOM()').where.not(avatar: nil)
但是我还需要检查有帖子的用户。我怎么能这样做,因为帖子在不同的表中?
谢谢。
答案 0 :(得分:4)
你可以使用User和Post之间的关联(如果Post是你的模型),这将检查两种情况下的外键和主键是否匹配,最终检查用户是否记录了一些帖子:
User.order('RANDOM()').joins(:posts).where.not(avatar: nil)
# SELECT "users".*
# FROM "users"
# INNER JOIN "posts" ON
# "posts"."user_id" = "users"."id"
# WHERE ("users"."avatar" IS NOT NULL) ORDER BY RANDOM()
另一方面,您可以检查相关模型的ID(依赖于User的ID)是否为nil,这意味着它作为关联记录存在,如:
User.order('RANDOM()').joins(:posts).where.not(avatar: nil)
.where.not(posts: { id: nil })
答案 1 :(得分:2)
让用户同时使用头像和帖子的一种方法是使用SQL的EXISTS
运算符。然后,我们可以利用ActiveRecord的范围使这些查询可重用:
# app/models/user.rb
class User < ApplicationRecord
scope :with_avatar, -> { where.not(avatar: nil) }
scope :with_posts, -> { where('EXISTS(SELECT 1 FROM posts WHERE user_id = users.id)') }
end
现在,您可以在控制器中执行以下操作:
@users = User.order('RANDOM()').with_avatar.with_posts
希望这有帮助!