2011-03-24 11 views
14

gelen sayfa numarasını bulmak?Raylar Sayfalandırma - nasıl kendi sayfa numarasını bulabilirsiniz, örneğin id ben sayfalandırılmış öğenin kimliğe sahip durumda

Raylar 3 ve kaminari kullanıyorum. Bir parametre bir seçenek değildir olarak

Maalesef sayfa numarasını geçirerek. Paginated öğeler, zaman içinde gelişen kullanıcı tarafından oluşturulan içerik tarafından korunan bir resim galerisinin görüntüleridir. Bu, bir sayfanın birinci haftada bir sayfa görünebileceğini, ancak sonraki hafta bir sayfa 2 olabileceği anlamına gelir. Fotoğraf değişen kapsamları birden galerilerde görünebilir

Diğer bir seçenek görüntüleri (acts_as_list) bir sayısal düzeni sağlamak olurdu, yine bu benim durumumda mümkün değildir.

düzenleme: Hiçbir çözüm ile çeşitli yerlerde bu aynı soruyu sordu yıl önce gördüğümüz gibi

Buna bir lütuf eklediniz. Etkin kayıt çözümü gelmezse, bir sql sorgusunu kabul etmekten mutluluk duyarım.

+0

Bu çok verimsiz olabilir ama sanırım * * o https://gist.github.com/885484 çalışır (henüz test etmemiş), bir sorgu kullanarak sonuç almak için iyi olurdu ama görünüyor zor bir problem olmak, bu döngü olmadan başka bir yaklaşımı görmek isterim. – jpemberthy

+0

Merhaba ve cevabınız için teşekkürler. Bu işe yarardı, ancak büyük koleksiyonlarda bu durum yavaş olacak diye bir sorgu için daha fazlasını umuyordum. – mark

cevap

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 

Şimdi ben aynı sorunu vardı Sınıf yöntemi

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 

Kullanımı

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

Cevabınız için teşekkür ederiz. Eminim bu iyi olacak, ancak diğer şeylerle meşgul olarak test etme şansı olmadı. – mark

+1

Tekrar merhaba ve gecikme için üzgünüm. Cevabınız bir düzeltme ile çalışır; pozisyon almak için <= koşulu olması gerekir. Yardım ettiğin için teşekkür ederim. – mark

+0

Tek ayrıntılandırma. uniq olmayan sütunlara göre sıralama yaparsanız, sonuçlar yanlış olabilir. Benim için ne çalışıyor - https://gist.github.com/pironim/5975256 – Vladimir

0

sayfa kimliği bazı sql sorguları gerekir anlamına gelir bulursanız. bunun yerine sayfa değerini param olarak geçirebilirsiniz. Bu da performansınızı artıracaktır.

+0

Teşekkürler Ramanavel. Buradaki sorunum, paginated örneğinin her zaman ilişkili kayıtlarının aynı sayfasında görünmeyebilir. Bu konuyla ilgili olarak açıklama ekleyeceğim. – mark

0

olarak fakat ancak birden siparişleri ile sarın. Sadece biraz kötü bir numarayla çalışabilirim.

@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 

Eğer koparmak sonucu birçok kayıtlarına yoksa sadece aksi takdirde yavaş alacak, iyi çalışır.

İlgili konular