【发布时间】:2011-03-24 22:45:28
【问题描述】:
我的“产品”表 has_many :registered_products。
我想使用类似的东西
products.find(:has_registered_products)
这将只返回在registered_products 表中也有条目的产品。我怎样才能做到这一点?
【问题讨论】:
标签: ruby-on-rails activerecord
我的“产品”表 has_many :registered_products。
我想使用类似的东西
products.find(:has_registered_products)
这将只返回在registered_products 表中也有条目的产品。我怎样才能做到这一点?
【问题讨论】:
标签: ruby-on-rails activerecord
只要您在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)
这将处理重复。
Product.joins(:registered_products).uniq
【讨论】:
正如 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
【讨论】:
class Product
has_many :registered_products
end
产品列表(至少有一个注册产品) - 急切加载的注册产品
Product.all(:include => :registered_products,
:conditions => "registered_products.id IS NULL")
产品列表(至少有一个注册产品)- 无需预先加载
Product.all(:joins => :registered_products)
【讨论】:
您可以使用 counter_cache (http://railscasts.com/episodes/23-counter-cache-column)。它应该比实际执行 join 来确定是否有任何子节点更快。
【讨论】: