2008-11-28 8 views
3

Existe-t-il un raccourci pour donner une limite et un ordre lors de l'accès à une relation has_many dans un modèle ActiveRecord?Raccourci pour spécifier une commande et une limite lors de l'accès à une relation has_many?

Par exemple, voici ce que je voudrais exprimer:

@user.posts(:limit => 5, :order => "title") 

Contrairement à la version plus longue:

Post.find(:all, :limit => 5, :order => "title", :conditions => ['user_id = ?', @user.id]) 

Je sais que vous pouvez spécifier directement dans la relation has_many, mais Y a-t-il un moyen de le faire à la volée, comme montrer 10 messages sur une page, mais seulement 3 sur une autre?

Répondre

8

J'ai quelque chose de similaire dans un modèle de blog:

has_many :posts, :class_name => "BlogPost", :foreign_key => "owner_id", 
    :order => "items.published_at desc", :include => [:creator] do 
     def recent(limit=3) 
     find(:all, :limit => limit, :order => "items.published_at desc") 
     end 
    end 

Utilisation:

Blog.posts.recent 

ou

Blog.posts.recent(5) 
1

Vous pouvez utiliser Ryan Daigle de utility_scopes. Une fois l'installation (c'est un bijou), vous obtiendrez de nouveaux champs d'application utiles telles que:

@user.posts.ordered('title ASC').limited(5) 

Vous pouvez définir même ordre par défaut et limite pour tous les modèles.

3

Vous pouvez le faire en utilisant un champ nommé sur le modèle post:

class Post < ActiveRecord::Base 
    named_scope :limited, lambda {|*num| {:limit => num.empty? ? DEFAULT_LIMIT : num.first}} 
end 

Ceci est essentiellement similaire à utility_scopes, tel que rapporté par @Milan, sauf que vous le faites repas morceau, que si vous devez faire il.

Questions connexes