2011-06-26 12 views
2

ActiveRecordselectのパラメータとして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) 

:私はこの(:LineItemProductOrderid年代を持ってここで私は、単純なモデルを持っている)のような意味します私はの下位互換性(旧式では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の実装の内部に関するいくつかの詳細で私を指して感謝します試験宝石:)

答えて

1

選択method--

# File activerecord/lib/active_record/relation/query_methods.rb, line 34 
def select(value = Proc.new) 
    if block_given? 
    to_a.select {|*block_args| value.call(*block_args) } 
    else 
    relation = clone 
    relation.select_values += Array.wrap(value) 
    relation 
    end 
end 

のソース - それはあなたがそれを求めているものをしないだろうことを示唆しています。しかし、それは任意にブロックを取ることができるので、あなたが探している振る舞いにそれを強要することができるかもしれません...

私がArelのものでできないことについて混乱するたびに、私はどのようにあなたの最後の質問のために私はこのことができますが、非常に少なくとも、それは探検する正しい方向にあなたを送信することがありますかわからない

Arel API

...

+0

スニペットでは、 'select'ブロックは主にテスト目的のために設計されています:ブロックで' select'を実行すると、( 'SELECT * FROM table'を介して) Array#select'を実行して、SQLではなくRuby言語を使用してフィルタリングします。 – jdoe

+0

ええ、そうだね。 – jaydel

関連する問題