【问题标题】:How can I count the object with condition?如何计算有条件的对象?
【发布时间】:2013-04-19 02:08:48
【问题描述】:

社区 has_many :codes
代码 belongs_to :community

用户 has_many :codes
代码 belongs_to :user

@community.codes.users.count

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

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

如果我只想统计visible上code为true的属于社区的用户数怎么办?

这可以算吗?

我的意思是,我想获得如下计算的计数。
我想要一行。

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

【问题讨论】:

  • 请举例说明你的问题
  • @eneskaya 感谢您的评论。我描述了一个例子:)
  • 好吧,让我们这样想。 @communities 是加利福尼亚州、纽约州等州...代码代表飞往这些州的机票。用户已经购买了很多遍及各州的门票,购买的门票数量取决于每个用户。在这里,我想统计一下已经购买到加利福尼亚(@community)门票的用户数量,并且门票被保存为其他用户不可见。这有意义吗?
  • 不能是这样的吗? @count = @community.codes.where(:visible => true).users.count

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


【解决方案1】:

这一行相当于你所需要的。它会给出准确的结果。

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 个答案中,当用户被删除并且仍然有代码时,它仍然很重要......但是使用你的代码,当用户被删除时它不会'不再数他了。这就是我想要的。谢谢:)
  • 再问一个问题!!!如果我有另一个名为Profile 的模型,它有一个名为notification 的布尔列。然后用户 has_one :profile, Profile belongs_to :user。我怎样才能将此条件添加到您的条件中?我是说。如果 user.profile.notification 为假,则不应计算在内。你能告诉我怎么做吗?
  • 这不是更好的方法。它更快。更好的是创建self.visible_in_community 方法。请参阅 Rails 指南ActiveRecord Querying 第 13.2 节
  • @cat:我认为它对你有用:User.joins(:profile).joins(:codes => :community).where("codes.visible=? AND profiles.notification= ? AND community.id=?", true, true, @community.id).count
【解决方案2】:

希望这对你有用。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2017-07-27
      相关资源
      最近更新 更多