10

与えられた

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

Rails 3スタックを使用して、製品を「持っている」すべてのカテゴリをクエリするにはどうすればよいですか?

4

3 に答える 3

34

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.
于 2010-10-08T16:47:24.483 に答える
14
Category.joins(:products).select("distinct categories.*").all
于 2010-09-17T07:15:37.233 に答える
1

もう1つの簡単なアプローチは、ActiveRecordクエリインターフェイスjoinをARelと組み合わせて条件ステートメントに使用することです。

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

sqlite3で次のSQLを生成します。

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

そして、postgresの次のSQL(ILIKEに注意してください):

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

これにより、簡単に参加できますが、ARelマッチャーをRDBMSに抽象化することもできます。

于 2014-04-16T15:05:32.263 に答える