我的产品" table has_many:registered_products。
我想使用像
这样的东西products.find(:has_registered_products)
其中只返回在registered_products表中也有条目的产品。我怎么能做到这一点?
答案 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)。它应该比实际进行连接更快,以找出是否有任何孩子。