Этого можно добиться, добавив предложение :order
к ассоциации has_many :has_seens
, чтобы упорядочить их по дате создания. Затем используйте расширение ассоциации, чтобы определить метод для самой ассоциации:
class User < ActiveRecord::Base
has_many :has_seens, :order => 'created_at DESC' do
def recent(count=10)
all(:limit => count)
end
end
end
Теперь вы можете использовать user.has_seens.recent
для просмотра последних десяти фильмов. При желании, введите другой счет, например, user.has_seens.recent(25)
.
Между прочим, я думаю, что viewings
является менее неловким именем ассоциации, чем has_seens
!
Редактировать : Лично я бы все устроил с помощью Viewing
модели соединения, например:
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
Я использовал область по умолчанию для модели Viewing
, но вы можете указать порядок для ассоциаций, если просмотры должны быть упорядочены по другому атрибуту, кроме даты создания по умолчанию.
Теперь вы можете сделать:
# 10 most recent viewings for everyone
recent = Viewing.recent(10)