J'ai des relations has_many et je veux fixer une limite personnalisée et offset. ainsi que pour les compter

StackOverflow https://stackoverflow.com/questions/2546702

Question

Hy,

Mon code:

@profile.images

et je voudrais obtenir seulement 10 images à temps et avec un 10 décalage, comme celui-ci

@profile.images(:limit => 10, :offset => 10)

et pas comme ça

has_many :images, :limit => 10, :offset => 10

Alors je voudrais compter dans toutes les images someway pour ce profil.

@profile.count_images

Merci (:


has_many :images, :foreign_key => 'on_id', :conditions => 'on_type = "profile"' do
def paginate(page = 1, limit = 10, offset = nil)
  page = nil if page < 1
  limit = 1 if limit < 1
  offset = 0 if(offset && offset < 0)
  offset = 0 if (!page)
  offset = limit * (page - 1) if (page)

  all(:limit=> limit, :offset => offset)
end

end

Maintenant, je voudrais ajouter ce comportement à d'autres relations has_many. Mais je ne voudrais pas copier coller le code ... Une idée? : P

Était-ce utile?

La solution

Utiliser des extensions d'association:

class Profile < ActiveRecord::Base
  has_many :images do
    def page(limit=10, offset=0)
      all(:limit=> limit, :offset=>offset)
    end
  end
end

Maintenant, vous pouvez utiliser la méthode page comme suit:

@profile.images.page # will return the first 10 rows
@profile.images.page(20, 20) # will return the first 20 rows from offset 20
@profile.images # returns the images as usual

Modifier

Dans ce cas précis, la fonction d'association peut être une option appropriée. Même lambda avec named_scope pourrait fonctionner. Si vous définissez sur la classe Profile vous desserrez l'aspect réutilisable du named_scope. Vous devez définir la named_scope de votre classe d'image.

class Image < ActiveRecord::Base

  named_scope :paginate, lambda { |page, per_page| { :offset => ((page||1) -1) * 
                              (per_page || 10), :limit => :per_page||10 } }

end

Maintenant, vous pouvez utiliser ce named_scope avec l'association:

@profile.images.paginate(2, 20).all

Vous pouvez aussi utiliser directement le named_scope sur la classe Image

Image.paginate(2, 20).all(:conditions => ["created_at > ?" , 7.days.ago])

D'autre part, pourquoi n'êtes-vous pas utiliser le will_paginate plugin?

Autres conseils

Vous pouvez utiliser with_scope à la portée de votre appel à @profile.images et effectuer le compte en dehors du champ d'application.

Image.with_scope(:find => { :limit => 10, :offset => 10 }) do
  @profile.images      # load association using limit and offset
end

@profile.images.reset  # reset cached association, else size would return <=10
@profile.images.size   # go to the database again for a real COUNT(*)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top