Rails has_many,只找到有孩子的人

时间:2011-03-24 22:45:28

标签: ruby-on-rails activerecord

我的产品" table has_many:registered_products。

我想使用像

这样的东西
products.find(:has_registered_products) 

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

5 个答案:

答案 0 :(得分:11)

只要您在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)

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

答案 1 :(得分:4)

这将处理重复。

Product.joins(:registered_products).uniq

答案 2 :(得分:1)

正如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

答案 3 :(得分:0)

class Product
  has_many :registered_products
end

产品清单(至少有一个注册产品) - 渴望加载的注册产品

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

产品清单(至少有一个注册产品) - 没有急切加载

Product.all(:joins => :registered_products)

答案 4 :(得分:0)

您可以使用counter_cache(http://railscasts.com/episodes/23-counter-cache-column)。它应该比实际进行连接更快,以找出是否有任何孩子。