2015-10-12 2 views
1

У меня есть три модели: Article, Comment, User.Получите все статьи, которые определенный пользователь не прокомментировал

Пользователь может прокомментировать статью.

Вот как получить все статьи, в которых нет ни одного комментария вообще, но я хочу, только те, что определенный пользователь имеет не прокомментировал еще:

Article.includes(:comments).where(:comments => { :id => nil }) 

Update

class Article 
    has_many :comments 
end 

class Comment 
    belongs_to :article 
    belongs_to :user 
end 

class User 
    has_many : comments 
end 
+0

Вы можете разместить ассоциации между моделями? – Pavan

ответ

1
#app/models/article.rb 
class Article < ActiveRecord::Base 
    scope :no_user_comments, ->(id) { joins(:comments).where('comments.user_id NOT IN (?)', id) } 
end 

Вы можете передать:

@articles = Article.no_user_comments @user.id 

или

@articles = Article.no_user_comments [@user.id, "15", "25"] 
0

Попробуйте это.

Article.joins(:comments).group('article.id').having('count(comments.id) =0') 
+0

Добавление некоторого объяснения вместо простого кода было бы неплохо ... – eirikir

+0

Ok dude - в следующий раз я буду –

0

Добавить этот метод в класс статьи

class Article < ActiveRecord::Base 
    def self.with_no_comments_by(user) 
    includes(:comments). 
     references(:comments). 
     where.not(comments: { user_id: user.id }) 
    end 
end 
1

Я просто пришлось столкнуться с такой же вопрос, но, кажется, что ответы, не будет работать:

@articles = Article.joins(:comments).where.not(comments: {user_id: @user.id}) 

или различные различные варианты, также возвращает статьи комментировали пользователем, если они где комментировал также другие пользователи. . Article1: commentA по user1, user2 commentB по

Я нашел поистине безвкусный решение:

#app/models/article.rb 
class Article < ActiveRecord::Base 
    has_many :comments 
    has_many :users, through: :comments #create a many-to-many relations 
end 

и

@articles = Article.joins(:comments).reject {|f| f.users.where(id: @user.id).present? } 

Гадкий и очень дорого с точки зрения производительности (много запросов SQL) , Более подробную информацию о отклонять проверить детали HERE

Надежда кто-то находит более элегантный и эффективный способ

Смежные вопросы