So I have a Post and a User.
Post has_many users and a user belongs_to a post.
I need a find that will find all the Posts that dont have any users like the following:
Post.first.users
=> []
Post.where("id not in (select post_id from users)")
Learned this one just today:
Post.eager_load(:users).merge(User.where(id: nil))
Works with Rails 4+ at least.
Update:
In Rails 5+, you can use left_joins
instead:
Post.left_joins(:users).merge(User.where(id: nil))
something like that:
p = Post.arel_table
u = User.arel_table
posts = Post.find_by_sql(p.join(u).on(p[:user_id].eq(u[:p_id])).where(u[:id].eq(nil)).to_sql)
I know this is tagged as Rails 3, but if you are using Rails 4, I've been doing it like this.
Post.where.not(user_id: User.pluck(:id))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With