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)
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é. –