列出拥有Ruby on Rails 5帖子的用户

时间:2018-01-11 00:19:13

标签: sql ruby-on-rails ruby ruby-on-rails-5

目前我有这个查询来拉动所有拥有头像的用户:

@users = User.all.order('RANDOM()').where.not(avatar: nil)

但是我还需要检查有帖子的用户。我怎么能这样做,因为帖子在不同的表中?

谢谢。

2 个答案:

答案 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

希望这有帮助!