Rails MySQL包含限制

时间:2010-10-31 22:52:47

标签: ruby-on-rails

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

我正在尝试提取Post数据,同时也急切加载User和Comment数据,但是没有加载已被阻止的注释的限制(Comment表中的TINYINT字段)。当有评论时,以下内容有效,但是当我加载没有任何评论的帖子时,它会导致问题:

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

有关如何运行此查询的任何建议,以便在没有注释时它可以工作吗?感谢。

2 个答案:

答案 0 :(得分:0)

当您尝试在没有评论的帖子上执行此操作时会出现什么错误?

更新

这种变化怎么样?

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

急切加载协会的条件有点不同寻常。也许您应该使用:joins选项代替?或者跳过急切加载帖子(因为它只是一个帖子),并且在视图中使用了非阻止评论的命名范围。也许是这样的事情:

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

(只需在这里输入袖口,不确定这是非常合适的语法)

答案 1 :(得分:0)

好的,所以经过一些摆弄,这是答案(这对某些人来说似乎很明显,但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()函数。感觉就像一个kludge,但现在我很好。如果有人有更优雅的解决方案,请告诉我!