2009-09-23 3 views
4

최근에 내 쿼리를 4 개의 명명 된 범위로 분리하여 다시 정렬하기 쉬워졌으며 페이지별로 계산하지 못하는 페이지 매김이 문제없이 페이지 수를 계산합니다. 그래서 결국에 던져 PAGINATE와 같이 사용는 명명 된 범위와 함께 잘못된 매김을 매김합니다.

named_scope :loc, lambda { |id| { :conditions => ['location_id = ?', id ] } } 
    named_scope :datem, lambda { |*args| { :joins => :scannables, :conditions => [ "scannables.bookdate BETWEEN ? and ?", (args[0].to_date || 3.days.from_now), (args[0].to_date+(args[1] || 3)) ], :group => 'scannables.hostel_id', :having => 'SUM(scannables.available) > ' + ((args[1] || 3).to_i-1).to_s } } 
    named_scope :order_by_external_desc, :include => :external_ratings, :order => 'SUM(scannables.available) DESC, external_ratings.rating DESC' 
    named_scope :order_by_external_asc, :include => :external_ratings, :order => 'SUM(scannables.available) DESC, external_ratings.rating ASC' 

...

@location = Place.loc(params[:id]).datem(user_cart.getDate,user_cart.getDays).order_by_external_desc.paginate(:per_page => 15, :page => params[:page]) 

페이지를 매기는 의지 예를 들어 15 각 6 페이지가 보여하지만 4 페이지에 도착, 페이지 5 6이 사라집니다 ... 5 또는 6으로 직접 뛰어 오르는다면 그들은 존재하지 않습니다.

는 그것을보고, 나는 데 페이지를 매기는 것이다 문제로 실현

[email protected] = Place.loc(params[:id]).datem(user_cart.getDate,user_cart.getDays).order_by_external_desc.size 

c = 78 

는하지만 SQL은 전 생성하기

[email protected] = Place.loc(params[:id]).datem(user_cart.getDate,user_cart.getDays).order_by_external_desc 

c.size = 56 

후자보다 약 8 라인 짧은이다 그리고 더 많은 결과를 반환하게 내 HAVING 조항을 무시 ...

이 문제를 해결하는 방법에 대한 아이디어?

+1

샷 :'.peginate' 앞에'.all'을 추가하는 것이 도움이됩니까? – tsherif

+0

아직 답변이 없습니까? – Joerg

답변

0

named_scope 데이터에서와 같이 group_by/having을 사용할 때 - ActiveRecord가 불행히도 카운트를 잘못 가져옵니다. 당신이 그것에 대해 할 수있는 일이 많지 않다고 생각합니다. 나는 이것이 ActiveRecord의 버그 일 필요가 있는지, 아니면 실제로 생성 된 SQL의 특성에 따라 ActiveRecord를 사용할 때 실제로 정확하게 계산 될 수없는 것인지에 대해서도 확신하지 못한다.

어느 쪽이든 -이 '버그'를 해결해야합니다.

이 작업을 수행하는 방법은 별도의 SQL 문에서 수 (당신이 올바른 결과를 제공하는 일)를 해결하는 것입니다, 그래서 같은 PAGINATE 결과에 추가 : 어둠 속에서

total_entries = Place.count(sql) # or the combinations of named_scopes etc with a .size or whichever one gives you the correct count 

Place.scopes.paginate(:per_page => 15, :page => params[:page], :total_entries => total_entries) # where scopes are all of your named scopes as you have in your examples