2008-10-09 2 views
9

'유형', '다양성'및 '가격'속성이있는 테이블이있는 경우, 여기에 각 유형의 최소 가격으로 레코드를 가져 오는 오래된 질문입니다. 입니다. 이보다 더 나은 구현이 있습니까ActiveRecord의 각 그룹에 대한 최소/최대 가져 오기

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

: 우리는 아마도하여이 모방 할 수

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에서

, 우리는에 의해 this을 할 수 있습니까?

+0

:

여기

업데이트 된 URL입니다

Table.minimum (: 타입 가격 : 그룹 =>) – aashish

답변

0

# find_by_sql을 사용할 수 있지만, 이는 원하는 것이 아닌 모델 개체를 반환하는 것을 의미합니다.

당신이 금속에 노출 가고 싶은 경우에, 당신은 또한 # select_values를 사용할 수 있습니다

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]] 

액티브 그냥 도구입니다. 편리 할 때 사용하십시오. SQL이 더 나은 일을 할 때, 당신은 그것을 사용합니다.

0

저는 잠시 동안이 문제에 대해 싸워 왔습니다. 잠시 동안 당신은 SQL을 생성하는 데 상당히 어려움을 겪고있는 것 같습니다.

그러나 몇 가지 제안 사항이 있습니다.

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>) 

당신이 볼 수 있듯이, 나는 아직도 원시 SQL을 사용하고 있습니다 : 프랑수아 제안 @, 나는이 액티브의 to_sqljoins는 "가이드"내 SQL 조금하는 데 사용했습니다 대신 find_by_sql

, , 적어도 AR이 지원을 제공하지 않는 부분에만 있습니다 (AFAIK ActiveRecord는 INNER JOIN ... ON ...을 관리 할 수 ​​없으며).

find_by_sql 대신 joins을 사용하면 쿼리를 체인화 할 수 있습니다. 추가 조건을 추가하거나 테이블을 정렬하거나 모든 것을 범위에 넣을 수 있습니다.

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

0

위 Avdi의 답변을 업데이트하려면 각 유형에 대한 최대 및 최소 가격을 얻는 방법 ??
+1

아마도 레일스의 최신 버전에 대한 링크가 도움이 될 것입니다. 왜 2 가지 주요 버전으로 링크를 선택했는지 확실하지 않습니다. –

+0

아이작 감사합니다. 업데이트 됨. – danielmbarlow