【问题标题】:How to count has_and_belongs_to_many in Rails?如何在 Rails 中计算 has_and_belongs_to_many?
【发布时间】:2013-10-17 12:21:06
【问题描述】:

我正在开发一个具有以下结构的简单 Rails:

    Product
    has_and_belongs_to_many :subscribers

    Subscriber

    has_and_belongs_to_many :products

我怎样才能得到所有有订阅者的产品是订阅者> 0的产品?

def self.has_subscribers
   #subscribers > 0
end

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-3.2 ruby-on-rails-4


    【解决方案1】:

    你试过吗,

    @product.subscribers.count > 0
    

    所以你可以做类似的事情

    def has_subscribers?
      subscribers.count > 0 
    end
    

    【讨论】:

    • OP 正在寻找所有有订阅者的产品,而不是检查产品是否有订阅者。我同意,OP 使用的函数名称有点误导。
    • 啊!我明白了。那我相信你的解决方案更准确。
    【解决方案2】:
    def self.has_subscribers
       Product.joins("LEFT JOIN products_subscribers ON products_subscribers.product_id = products.id").where("products_subscribers.product_id IS NOT NULL")
    end
    

    HTH

    编辑:我不确定,如果下面的工作,但你可以试试: def self.has_subscribers Product.joins(:products_subscribers) 结尾 由于joins使用INNER JOIN,它应该只返回连接表中与subscribers有关系的products的记录。

    编辑 2:仅仅加入连接表可能不起作用(实际上不应该),因为连接表通常没有模型。

    以上对我有用,但我忘了GROUP 结果。

    Product.joins("LEFT JOIN products_subscribers ON products_subscribers.product_id = products.id").where("products_subscribers.product_id IS NOT NULL").group("products.id")
    

    如果你仍然收到Subscribers,那就有点奇怪了。请发布您的功能和查询代码。

    【讨论】:

    • 这只会带出订阅者。但不告诉我产品
    • 这很奇怪。无论如何,我已经更新了我的答案。如果您遇到任何问题,请再试一次并用代码发回。
    【解决方案3】:
    Product.where( '(select count(1) from products_subscribers where product_id = products.id > 0)')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多