2010-03-16 6 views
2

J'ai un modèle user, un modèle movie et cette association dans user.rb (j'utilise has_many: par parce qu'il ya d'autres associations entre ces deux modèles):Comment trouver les associations les plus récentes créées entre deux objets avec Rails?

has_many: has_seens
has_many: movies_seen, : à travers =>: has_seens,: source =>: film

Je suis en train d'obtenir un tableau des dix plus récentes has_seens associations créées. Pour l'instant, la seule solution que j'ai trouvée est d'explorer tous les utilisateurs, en créant un tableau avec chaque utilisateur. Has_seens trouvé, puis trier le tableau par has_seen.created_at et ne garder que les 10 derniers éléments ... On dirait un lourd opération.

Y a-t-il un meilleur moyen?

Kevin

+0

Y at-il une raison particulière que vous utilisez le modèle 'Movie' que la table de jointure comme spécifié par le': l'option source'? Généralement, vous utilisez l'association ': has_many: through' lorsque vous voulez un modèle de jointure séparé. –

Répondre

1

Vous devriez être en mesure d'accomplir ceci en ajoutant une clause :order à l'association has_many :has_seens pour les commander avant la date de création. Ensuite, utilisez une extension d'association pour définir une méthode sur l'association elle-même:

class User < ActiveRecord::Base 
    has_many :has_seens, :order => 'created_at DESC' do 
    def recent(count=10) 
     all(:limit => count) 
    end 
    end 
end 

Maintenant, vous pouvez utiliser user.has_seens.recent pour obtenir les plus récents dix films vus. Facultativement, transmettez un nombre différent, par ex. user.has_seens.recent(25). Par ailleurs, je pense que viewings est un nom d'association moins maladroit que has_seens!


Modifier: Personnellement, j'arranger les choses avec un Viewing joindre modèle, comme ceci:

class User < ActiveRecord::Base 
    has_many :viewings 
    has_many :movies, :through => :viewings 
end 

class Viewing < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :movie 

    default_scope :order => 'created_at DESC' 

    # Recent n viewings for any user 
    named_scope :recent, lambda { |count| { :limit => count }} 
end 

class Movie < ActiveRecord::Base 
    has_many :viewings 
    has_many :users, :through => :viewings 
end 

J'ai utilisé une portée par défaut sur le modèle Viewing, mais vous pouvez spécifier le ordonner sur les associations si les visionnages doivent être ordonnés par un autre attribut autre que la date de création par défaut.

Maintenant, vous pouvez faire:

# 10 most recent viewings for everyone 
recent = Viewing.recent(10) 
+0

Merci pour votre réponse. La méthode "récente" est utile, mais j'ai déjà réussi à obtenir les dix has_seens les plus récents d'un utilisateur spécifique. J'essaie plutôt d'obtenir les has_seens les plus récents de la base de données, entre tous les utilisateurs. –

+0

@Kevin, voir mon édition ci-dessus. –

0

Vous pouvez le faire en utilisant find:

HasSeen.find(:order => 'created_at DESC', :limit => 10) 

Vous pouvez utiliser un named_scope (intérieur modèle Hasseen) comme ceci:

named_scope :recent, :order => 'created_at DESC', :limit => 10 

et appelez HasSeen.recent.

Si vous êtes à la recherche pour les utilisateurs, un outil facile (mais pas la plus efficace, je ne sais pas comment faire exactement la jointure) façon de le faire est recent_users = HasSeen.recent.map { |h| h.user }

Si ce dernier est ce que vous êtes Vous cherchez, poster un commentaire et je vais le nettoyer dans un named_scope pour le modèle des utilisateurs.

Questions connexes