2010-10-31 54 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()函数的。这感觉就像是一个混血儿,但现在我确定了。如果有人有更优雅的解决方案,请告诉我!