2012-03-09 1 views
2

두 모델이 연관되어 있습니다. Artist 모델과 Review 모델이 있습니다.datamapper를 사용하여 결과 순서 지정

class Artist 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, String 

    has n, :reviews 

end 

class Review 
    include DataMapper::Resource 

    property :id, Serial 
    property :rating, Integer 
    property :body, String 

    belongs_to :artist 
end 

내 목표는 그와 관련된 리뷰의 평균 평가에 의해 주문 예술가의 배열을 검색하는 것입니다. 나는 이것에 대한 한 가지 해결책이 있는지 확실하지 않지만 현재의 방법은 평균 등급으로 분류 된 아티스트의 ID로 배열을 만드는 것입니다. 이 배열을 얻는 방법에 대한 세부 사항은이 질문에 중요하지 않지만 배열이 있다고 가정 해 봅시다.

ids_sorted_by_rating = [4,5,23,9,2,48,17,....] 

그러면 아티스트를 검색합니다.

artists = Artist.all(:id => ids_sorted_by_rating) 

다른 옵션을 지정하지 않으면 datamapper가 id를 주문합니다. 그래서 ids_sorted_by_rating을 얻으려고 열심히 노력한 결과, 아직 정렬 된 아티스트 목록이 남아 있습니다. id.

관련 리뷰의 평균 평점에 따라 아티스트의 목록을 제공하는 솔루션은 크게 감사 할 것입니다. 보너스는 내가 그 목록을 얻기 위해 백만 번 데이터베이스를 칠 필요가 없다면 가리킨다. :)

감사합니다. 추가 정보가 필요하면 알려주세요.

답변

1

AFAIK DataMapper에서 집계별로 정렬하는 쉬운 방법은 없습니다 (단일 쿼리로 처리하는 방법). 방금 (예를 들어, 당신은 목록이 포함 된 웹 페이지를 만드는) 데이터를 표시하려면

hash = artists.index_by(&:id) 
# if you do not have index_by - use a artists.inject({}){|h,a| h.merge(a.id => a)} 
ids_sorted_by_rating.map{|id| hash[id]} 
+0

나는 너를 잊지 않았다. 나는 이것을 시험해 볼 기회가 없었습니다. – wuliwong

+0

고마워, 나는이 질문을 해결하기 위해 쓰고있는 문제와 다른 방향으로 나아 갔다.하지만 나는 똑같은 문제를 새로운 곳에서 생각해 냈다. 내가해야 할 일은 datamapper': through => Resource'를 말하는 대신 사용자 지정 연결을 만드는 것입니다. – wuliwong

0

과 : 당신은 (데이터 셋이 너무 큰하지 않는 한) 결과의 응용 프로그램 측의 재 배열을 사용할 수 있습니다 Structs의 배열이됩니다 이것은 Artist 객체를 반환하지 않습니다

repository(:default).adapter.select(
'SELECT artists.* 
FROM artists JOIN reviews on artists.id = reviews.artist_id 
GROUP BY artists.id 
ORDER BY AVG(reviews.rating)') 

하지만 다음 Artists 당신이 "속임수"를 사용할 수있는 SQL (당신은 SQL 데이터 저장소를 사용하는 가정을) 변경 될 수 없습니다 각각은 Artist의 모든 속성을 갖기 때문에 모든 데이터를 가져올 수 있지만 업데이트하는 것은 그리 좋은 일은 아닙니다. 이후의 쿼리는 "실제"Artist을 가져올 수 있습니다 (예 : 사용자가 아티스트의 링크를 클릭하고 해당 개체를 쿼리하기 위해 적절한 id 값을 사용할 수 있음).

다른 방언의 SQL에 대해서도 조심해야하며, 사용하고있는 DBMS에서 작동하도록 조정해야 할 수도 있습니다 (Sqlite에서 작동하며 다른 것을 시도하지 않았습니다).

그러나 배열은 각 아티스트의 리뷰 평점 순으로 정렬됩니다.

+0

로컬 컴퓨터 나 heroku에 따라 Sqlite와 Postgres 사이를 전환합니다. 스트레이트 Datamapper를 사용하면 Sqlite에서 Postgres 로의 변경을 한 줄로 처리 할 수 ​​있습니다. 그래도 고마워. 앞으로 리소스 소비가 심각한 문제가된다면 이런 식으로 구현해야 할 수도 있습니다. – wuliwong