2014-10-28 6 views
0

쿼리에서 관련 모델의 평균을 사용 :액티브 : 나는 조금 다음과 같이 몇 가지 레일 모델을 가지고

class Manufacturer 
    has_many :widgets 
end 

class Widget 
    belongs_to :manufacturer 
    has_many :listings 

    def weighted_average 
    listings.sum('value * stock')/listings.sum('stock') 
    end 
end 

class Listing 
    # Represents that a merchant is selling some widgets 
    belongs_to :widget 
    belongs_to :merchant 
    # Model has a :price, eg. $5.99 
    # Also has a :stock, eg. 45 units 
end 

지금 Listing#value가의 weighted_average 이하이고 모든 Listing 객체를 찾으려면 Widget에 속합니다.

예를 들어, 특정 위젯의 평균 가격이 $ 5이고 $ 4, $ 4.50 및 $ 6의 목록이있는 경우 처음 두 개를 반환하고 싶습니다. 평균 가격보다 낮 으면 좋은 거래.

쿼리는 모든 위젯에 대해 값이 싼 모든 목록을 생성해야하며 단일 쿼리에서이 작업을 수행 할 수 있어야합니다.

어떻게 ActiveRecord 쿼리를 사용하여이 작업을 수행 할 수 있습니까? 이상적인 의사, 그것은 것 같은 뭔가 :

Listing.where('listing.price < widget.weighted_average') 
# Not possible, because weighted_average isn't a column in the DB, but a method. 
+0

시도해 보셨습니까?'Listing.where ('price Alireza

+0

'widget.sum ('value * stock')/widgets.sum ('stock')'또는보다 정확하게'weighted_average'메소드의'위젯 '은 무엇입니까? – Surya

+0

하나의 위젯 목록뿐만 아니라 여러 위젯에 대해이 기능을 사용하고 싶습니다. 위의 제안은 위젯의 평균이 아닌'where' 절에 대해 동일한 값을 사용합니다. 나는 또한'widgets.sum'이 아닌'listings.sum'을 가지고 있다는 것을 깨달았다. - 나는 나의 질문을 편집했다. –

답변

0

시도 :

Listing.joins(:widget).where("#{Listing.table_name}.price < ?", 15) 

편집 :

수 귀하의 가중 평균 함수 결과로 대체되어야한다. 사용중인 데이터베이스에 따라 원하는 결과를 정확히 반환하는 SQL 쿼리 일 수 있습니다. 예를 들어, PostgreSQL HAVING 절이 필요합니다.

+0

조금 더 명확하게하기 위해 질문을 업데이트했습니다. 쿼리는 모든 위젯에 대해 값이 싼 모든 목록을 생성해야하며, 단일 쿼리에서이 작업을 수행 할 수 있기를 원합니다. 숫자는 동적이며 변수를 전달하는 대신 쿼리에서 조회해야합니다. –

+0

그런 다음'HAVING' 절을보십시오. – blelump

관련 문제