2010-10-31 91 views
0
class Comment < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :user 
end 

class Post < ActiveRecord::Base 
    has_many :comments 
    belongs_to :user  
end 

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :comments 
end 

我想拉出發佈數據,同時渴望加載用戶和評論數據,以及與不加載評論已被封鎖(評論中的TINYINT字段的限制表)。當有以下工作的意見存在,但它造成的問題時,我加載沒有任何評論的帖子:Rails的MySQL包括限制

@post = Post.find(params[:id], 
      :include => {:comments => :user}, 
      :conditions => "comments.blocked = 0") 

我如何能運行此查詢任何建議,使得其工作時,沒有評論存在?謝謝。

回答

0

當您嘗試在沒有評論的帖子上這樣做時會出現什麼錯誤?

更新:

這個變化怎麼樣?

@post = Post.find(params[:id], 
     :include => {:comments => :user}, 
     :conditions => {:comments => {:blocked => false}}) 

在急切加載的關聯上的條件是不尋常的。也許你應該使用:連接選項呢?或者跳過急切地加載帖子(因爲它只是一個),併爲視圖中使用的非阻止註釋命名一個範圍。像這樣的事情也許:

@post = Post.find(params[:id]) 
@comments = @post.comments.where(:blocked => false).all(:include => :user) 

(這裏只是打字即興,不能肯定對你完全正確的語法)有點擺弄後

+0

的ActiveRecord :: RecordNotFound在PostsController#顯示 找不到郵政與ID = 31,(comments.blocked = 0) – 2010-11-01 19:15:30

+0

感謝這個!第一個仍然給我同樣的錯誤,雖然我很確定你的第二個建議可以在Rails 3上運行,但我運行的是Rails 2.3.5,並在「where」方法上出現錯誤。 但是,我將嘗試您的建議:連接或named_scope。我對Rails有點新鮮,而且我一定會被看上去很神奇的:include包含...... :-) – 2010-11-03 15:02:07

0

OK,所以,這裏的答案(這似乎明顯一些,但在MySQL中count()函數是給我一些悲傷):

@post = Post.find(params[:id], 
      :include => {:comments => :user}, 
      :conditions => "comments.blocked = 0 OR posts.comments_count = 0") 

comments_count是counter_cache場,所以我讓周圍的明確使用MySQL的count()函數的。這感覺就像是一個混血兒,但現在我確定了。如果有人有更優雅的解決方案,請告訴我!