与えられた
class Category < ActiveRecord::Base
has_many :products, :order => 'name ASC'
end
Rails 3スタックを使用して、製品を「持っている」すべてのカテゴリをクエリするにはどうすればよいですか?
与えられた
class Category < ActiveRecord::Base
has_many :products, :order => 'name ASC'
end
Rails 3スタックを使用して、製品を「持っている」すべてのカテゴリをクエリするにはどうすればよいですか?
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.
Category.joins(:products).select("distinct categories.*").all
もう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に抽象化することもできます。