2015-10-12 90 views
1

我有三種模型:文章,評論,用戶。獲取某個用戶沒有評論的所有文章

用戶可以對文章發表評論。

這裏是如何得到那裏是沒有註釋的所有文章,但我只希望那些有一定用戶評論尚未:

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

更新

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

好吧夥計 - 下次我會 –

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}) 

或各種不同的變體,也將返回用戶的評論文章,如果他們在那裏被其他還評論用戶。 例如第一條:commentA通過USER1,commentB通過user2的

我發現這個真正不雅的解決方案:

#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

希望有人找到一個更優雅的和有效的方式

相關問題