arel, how to join

Jan picture Jan · Sep 17, 2010 · Viewed 17.2k times · Source

Given

class Category < ActiveRecord::Base
  has_many :products, :order => 'name ASC'
end

Using the Rails 3 stack, how can I query for all categories that 'have' products?

Answer

Snuggs picture Snuggs · Oct 8, 2010

In ARel (NOT ActiveRecord) we will do the following:

p = Arel::Table.new :products    # Base Rel-var
c = Arel::Table.new :categories  # Base Rel-var

predicate = p[:category_id].eq( c[:id] ) # for equality predicate

p.join(c)                   # Natural join
  .on( predicate )          # Equi-Join
  .group( p[:category_id] ) # Grouping expression to get distinct categories
  .project( c[:id] )        # Project the distinct category IDs of the derived set.