是否可以通過Hash
作爲ActiveRecord
的select
的參數?我的意思是這樣的(在這裏我簡單的模型:LineItem
有id
「的Product
S和Order
):散列用於ActiveRecord的選擇
Product.select(
:orders => [{:name => :buyer}, :email], # orders.name as buyer
:products => {:title => :product}). # products.title as product
joins(:line_items => :order)
得到以下SQL:
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"
如果是不可能的,那麼我建議一些向後兼容(可以用舊的方式,用1個簡單的字符串作爲peremeter)擴展爲select
方法,但我不知道如何使其作爲透明(即w/o _h
末爲我做了如下)應用範圍的更換:
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
我會感激約ActiveRecord
的實現內部的一些細節指點我關於它是被用來做這個非常obscure-模式到考試寶石:)
片段顯示'select'的模塊主要是爲了測試目的而設計的:'select'使用一個塊從相應的表中提取所有行(通過詳盡的'SELECT * FROM table')到一個數組中並應用'數組#選擇它,因此使用Ruby語言而不是SQL來過濾它。 – jdoe
是的,這聽起來是正確的。 – jaydel