在谷歌搜索,浏览SO和阅读之后,似乎没有一种Rails风格的方式来有效地仅获得Parent具有至少一个 Child对象(通过has_many :children关系)的那些对象.在纯SQL中:
SELECT *
FROM parents
WHERE EXISTS (
SELECT 1
FROM children
WHERE parent_id = parents.id)
Run Code Online (Sandbox Code Playgroud)
我最接近的是
Parent.all.reject { |parent| parent.children.empty? }
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我无法解决这个问题,我认为应该相当简单.我有两个型号(见下文).我正在尝试为SupplierCategory提出一个命名范围,该范围将找到所有SupplierCategory(s)(包括:供应商),其关联的供应商不是空的.
我尝试了一个直接加入,named_scope :with_suppliers, :joins => :suppliers它只给了我与供应商的类别,但它给了我每个类别单独列出,所以如果一个类别有2个供应商,我在返回的数组中获得两次类别:
目前我正在使用:
named_scope :with_suppliers, :include => :suppliers
Run Code Online (Sandbox Code Playgroud)
然后在我看来我正在使用:
<%= render :partial => 'category', :collection => @categories.find_all{|c| !c.suppliers.empty? } %>
Run Code Online (Sandbox Code Playgroud)
不完全雄辩,但说明了我想要实现的目标.
类定义
class SupplierCategory < AR
has_many :suppliers, :order => "name"
end
class Supplier < AR
belongs_to :supplier
end
Run Code Online (Sandbox Code Playgroud)