如何用条件计算物体?

时间:2013-04-18 16:38:20

标签: ruby-on-rails ruby-on-rails-3

社区 has_many:代码
代码 belongs_to:社区

用户 has_many:代码
代码 belongs_to:user

@community.codes.users.count

这将返回其代码属于社区的用户数。

代码将名为visible的列作为布尔值

如果我只想计算那些属于社区的visible代码为true的用户数呢?

有可能算上这个吗?

我的意思是,我想获得如下计算的计数数。
我想把它放在一行。

@community.codes.each do |code|
    if code.visible && code.user
        count = count + 1
    end
end

3 个答案:

答案 0 :(得分:2)

希望这对你有用。

@community.codes.where('visible = ? AND user_id IS NOT NULL', true).count

答案 1 :(得分:2)

此行等同于您的需要。它会给出确切的结果。

User.joins(:codes => :community).where("codes.visible=? AND communities.id=?", true, @community.id).count

还有另一个更好的方法。您应该将namedscope用于此类类型的查询,以便您可以在需要的地方多次使用它:

在用户模型中:

scope :visible_in_community, (lambda do |community_id|
  joins(:codes => :community).where("codes.visible=? AND communities.id=?", true, community_id) 
end)

你可以随时随地打电话

User.visible_in_community(@community.id)

答案 2 :(得分:1)

以下行等同于您问题的最后一段代码,但效率更高,因为在单个SQL请求中:使用Code获取计数User且属于{{ 1}}

@community