2011-03-24 3 views
14

페이지가 매겨진 항목의 ID가있는 경우 어떻게 페이지 번호를 찾을 수 있습니까?레일 페이지 매기기 - 인스턴스 ID에서 페이지 번호 찾기

레일 3과 카미나리를 사용하고 있습니다.

불행히도 페이지 번호를 매개 변수로 전달하는 것은 옵션이 아닙니다. 페이지 매김 된 항목은 시간이 지남에 따라 전개되는 사용자 생성 컨텐츠에 의해 유지되는 이미지 갤러리의 이미지입니다. 즉, 1 주일에 1 페이지이지만 다음 주에 2 페이지에 이미지가 나타날 수 있습니다.

또 다른 옵션은 숫자 순서의 이미지 (acts_as_list)를 유지하는 것이 었습니다. 내 경우에는 다양한 범위의 여러 갤러리에 사진이 나타날 수 있으므로 다시는 불가능합니다.

편집 : 나는 어떤 솔루션을 다양한 장소에서이 같은 질문 물었다 년 전에 참조로

이에 현상금을 추가했습니다. 활성 레코드 솔루션이 나타나지 않으면 SQL 쿼리를 받아 들일 수있어서 기쁩니다.

+0

이것은 매우 비효율적 일 수 있지만 https://gist.github.com/885484 (아직 테스트하지 않은 상태)에서 작동합니다. * 쿼리를 사용하여 결과를 얻는 것이 좋지만 어려운 문제가 아니라면 루프없이 다른 접근법을보고 싶습니다. – jpemberthy

+0

안녕하세요. 답에 감사드립니다. 그게 효과가 있지만 큰 컬렉션에서 느려질 것이기 때문에 더 많은 쿼리를 원했습니다. – mark

답변

19
# Your "per_page" count 
per_page = 30 
# Your Image instance: 
@image = Image.find_your_image 
# SQL. If you're ordering by id, how many lower IDs are there? 
position = Image.where("id <= ?", @image.id").count 
# Your page 
page = (position.to_f/per_page).ceil 

이제 저도 같은 문제를 가진 클래스 메소드

class Image < ActiveRecord::Base 
    def page(order = :id, per_page = 30) 
    position = Image.where("#{order} <= ?", self.send(order)).count 
    (position.to_f/per_page).ceil 
    end 
end 

사용

@image.page 
@image.page(:created_at) 
@image.page(:title, 10) 
+0

답장을 보내 주셔서 감사합니다. 나는 이것이 괜찮을 것이라고 확신하지만 다른 것들에 대해 바쁜 것으로서 그것을 시험 할 기회를 아직 가지지 못했다. – mark

+1

안녕하세요. 다시 지연되어 죄송합니다. 당신의 답은 한 가지 수정으로 작용합니다; 위치를 얻으려면 <= 조건이 있어야합니다. 당신의 도움을 주셔서 감사합니다. – mark

+0

하나의 상세 검색. Uniq이 아닌 열을 기준으로 정렬하면 결과가 잘못 될 수 있습니다. 나를 위해 일하는 것은 https://gist.github.com/pironim/5975256 – Vladimir

0

페이지 ID를 발견하면 일부 SQL 쿼리가 필요합니다. 대신에 페이지 값을 매개 변수로 전달할 수 있습니다. 이렇게하면 실적이 향상됩니다.

+0

Ramanavel에게 감사드립니다. 이 문제는 내 페이지가 매겨진 인스턴스가 연결된 레코드의 같은 페이지에 항상 나타나지 않을 수 있다는 것입니다. 이것에 관해서는 질문에 대한 설명을 추가하겠습니다. – mark

0

으로하지만, 함께하지만, 여러 개의 주문으로 포장 할 수 있습니다. 나는 그저 조금 나쁜 트릭으로 만 작동시킬 수 있었다.

@model = Model.find(params[:id]) 
page = 1 
    if params[:page] 
    page = params[:page] 
else 
    page = (Model.some_scope.order(some_attribute: :desc, updated_at: :desc).pluck(:id).index(@model.id).to_f/per_page).ceil 
end 

당신이 뽑은의 결과에 많은 레코드가없는 경우는 그렇지 않은 경우는 느린 얻을 것이다, 잘 작동합니다.