【问题标题】:Rails has_many, find only those with childrenRails has_many,只找到那些有孩子的
【发布时间】:2011-03-24 22:45:28
【问题描述】:

我的“产品”表 has_many :registered_products。

我想使用类似的东西

products.find(:has_registered_products) 

这将只返回在registered_products 表中也有条目的产品。我怎样才能做到这一点?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    只要您在registered_products 表中有产品的foreign_key,您就可以这样做:

    has_many :registered_products
    named_scope :with_registered_products, :joins => :registered_products
    
    # if you're using rails 3
    scope :with_registered_products, joins(:registered_products)
    

    这只会返回至少有一个相关注册产品的产品。

    【讨论】:

    • 别忘了选择它为不同的,否则你会得到重复的,这是我的:scope :at_least_one_image, select('DISTINCT recipes.*').joins(:images)
    【解决方案2】:

    这将处理重复。

    Product.joins(:registered_products).uniq
    

    【讨论】:

      【解决方案3】:

      正如 Jakob 指出的,如果有多个子记录,您需要确保您没有返回多个父对象。

      使用“select distinct”会起作用,但是当这个范围与其他范围组合时,select 语句可能会干扰。

      另一种选择是确保您连接到只有唯一记录的子表。您可以按如下方式编写您的加入来做到这一点

      class Product < ActiveRecord::Base
       has_many registered_products
      
       scope :with_registered_products, joins('join (select distinct product_id from registered_products) rp123456 on rp123456.product_id = products.id')
      end
      

      【讨论】:

        【解决方案4】:
        class Product
          has_many :registered_products
        end
        

        产品列表(至少有一个注册产品) - 急切加载的注册产品

        Product.all(:include => :registered_products, 
          :conditions => "registered_products.id IS NULL")
        

        产品列表(至少有一个注册产品)- 无需预先加载

        Product.all(:joins => :registered_products)
        

        【讨论】:

          【解决方案5】:

          您可以使用 counter_cache (http://railscasts.com/episodes/23-counter-cache-column)。它应该比实际执行 join 来确定是否有任何子节点更快。

          【讨论】:

            猜你喜欢
            • 2016-12-08
            • 2019-02-23
            • 1970-01-01
            • 1970-01-01
            • 2011-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多