Арель, как вступить - PullRequest
       6

Арель, как вступить

9 голосов
/ 17 сентября 2010

С учетом

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

Как использовать стек Rails 3, как я могу запрашивать все категории, у которых есть продукты?

Ответы [ 3 ]

29 голосов
/ 08 октября 2010

В ARel (НЕ ActiveRecord) мы будем делать следующее:

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.
14 голосов
/ 17 сентября 2010
Category.joins(:products).select("distinct categories.*").all
1 голос
/ 16 апреля 2014

Другой, более простой подход заключается в использовании join интерфейса запроса ActiveRecord в сочетании с ARel для условного оператора:

joins(:user)
.where(User.arel_table[:name].matches("%#{query}%"))

Создает следующий sql в sqlite3:

"SELECT \"patients\".* FROM \"patients\" INNER JOIN \"users\" ON \"users\".\"id\" = \"patients\".\"user_id\" WHERE (\"users\".\"name\" LIKE '%query%')"

И следующий sql в postgres (обратите внимание на ILIKE):

"SELECT \"patients\".* FROM \"patients\" INNER JOIN \"users\" ON \"users\".\"id\" = \"patients\".\"user_id\" WHERE (\"users\".\"name\" ILIKE '%query%')"

Это позволяет вам с легкостью присоединиться, но все же получить абстракцию средства сопоставления ARel к вашей RDBMS.

...