ActiveRecord
のselect
のパラメータとしてHash
を渡すことはできますか?それが不可能な場合はActiveRecordの選択のためのハッシュ
SELECT "orders"."name" as "buyer", "orders"."email", "products"."title" as "product"
FROM "products"
INNER JOIN "line_items" ON "line_items"."product_id" = "products"."id"
INNER JOIN "orders" ON "orders"."id" = "line_items"."order_id"
、次のSQLを取得するには
Product.select(
:orders => [{:name => :buyer}, :email], # orders.name as buyer
:products => {:title => :product}). # products.title as product
joins(:line_items => :order)
:私はこの(:LineItem
はProduct
とOrder
のid
年代を持ってここで私は、単純なモデルを持っている)のような意味します私はの下位互換性(旧式では1つの単純な文字列をペメメーターとして使用することができます)の延長を提案しますが、のようにする方法はわかりません。最後に私は以下の行ったように)、アプリケーション全体の交換:
class ActiveRecord::Base
def self.select_h(*fields) # TODO: rid of this ugly _h
hash_of_fields = fields.last.is_a?(Hash) ? fields.pop : {}
fields_in_hash = hash_of_fields.map do |table, field_or_fields|
(field_or_fields.is_a?(Array) ? field_or_fields : [field_or_fields]).map do |field|
field = "#{field.first[0]}\" as \"#{field.first[1]}" if field.is_a? Hash
"\"#{table}\".\"#{field}\""
end
end
# calling original select
select (fields+fields_in_hash).join(', ')
end
end
私は、これは非常にobscure-作るために使用された模様だに関するActiveRecord
の実装の内部に関するいくつかの詳細で私を指して感謝します試験宝石:)
スニペットでは、 'select'ブロックは主にテスト目的のために設計されています:ブロックで' select'を実行すると、( 'SELECT * FROM table'を介して) Array#select'を実行して、SQLではなくRuby言語を使用してフィルタリングします。 – jdoe
ええ、そうだね。 – jaydel