2008-10-09 24 views
9

Bu özellik, 'type', 'variety' ve 'price' niteliklerine sahip bir tablo verildiğinde, kaydı her bir tür için minimum fiyatla getirdiğiniz bir asıl sorudur. olduğunu. bundan daha iyi bir uygulama var mıActiveRecord'daki her grup için Minimum/Maksimum Getirme

minprices = Table.minimum(:price, :group => type) 
result = [] 
minprices.each_pair do |t, p| 
    result << Table.find(:first, :conditions => ["type = ? and price = ?", t, p]) 
end 

: Biz belki bu taklit olabilir

select f.type, f.variety, f.price 
from ( select type, min(price) as minprice from table group by type) as x 
inner join table as f on f.type = x.type and f.price = x.minprice;` 

: SQL

, biz tarafından this yapabiliriz?

+0

:

İşte

güncellenmiş URL

Table.minimum (: tip fiyat,: grup =>) – aashish

cevap

0

# find_by_sql numaralı telefonu kullanabilirsiniz, ancak bu, istediğiniz nesneyi olmayan bir model nesnesini döndürmeyi gerektirir.

Eğer metale çıplak gitmek isterseniz, ayrıca # select_values kullanabilirsiniz:

data = ActiveRecord::Base.connection.select_values(" 
     SELECT f.type, f.variety, f.price 
     FROM (SELECT type, MIN(price) AS minprice FROM table GROUP BY type) AS x 
     INNER JOIN table AS f ON f.type = x.type AND f.price = x.minprice") 
puts data.inspect 
[["type", "variety", 0.00]] 

ActiveRecord sadece bir araçtır. Uygun olduğu zaman kullanıyorsun. SQL daha iyi bir iş yaptığında, bunu kullanırsınız.

0

Bir süredir bununla savaşıyorum ve şu anda SQL'i oluşturmaya başladığınız anlaşılıyor. Bununla birlikte, bir çift geliştirmem var.

subquery_sql = Table.select(["MIN(price) as price", :type]).group(:type).to_sql 
joins_sql = "INNER JOIN (#{subquery_sql}) as S 
       ON table.type = S.type 
       AND table.price = S.price" 

Table.joins(joins_sql).where(<other conditions>).order(<your order>) 

Gördüğünüz gibi, hala ham SQL kullanıyorum: François önerdi @ gibi ben ActiveRecord en to_sql ve joins "rehber" benim SQL biraz alışık olduğunuz Yerine find_by_sql ait

, fakat en azından AR sadece destek vermediği kısımda (AFAIK ActiveRecord sadece INNER JOIN ... ON ...'u yönetemez) ve her şeyde değil.

Find_by_sql yerine joins kullanmak sorgulanabilir hale getirir - ek koşullar ekleyebilir, tabloyu sıralayabilir veya her şeyi bir kapsam içine alabilirsiniz.

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-minimum

0

yukarıda Avdi cevabını güncellemek için her tür için maksimum ve minimum fiyat nasıl elde edilir ??
+1

Belki de Rails'in daha güncel bir versiyonunun bir bağlantısı yararlı olabilir. Neden önce 2 ana sürümüne bağlanmayı seçtiğinizden emin değilsiniz. –

+0

Teşekkürler Isaac. Güncellenmiş. – danielmbarlow