您应该可以通过在has_many :has_seens
关联中添加:order
子句来完成此操作,以在创建日期之前对其进行排序。然后使用一个协会扩展到联想本身定义的方法:
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)
是否有您所使用的'Movie'模型作为连接表由'指定一个特别的原因:source'选项?当你想要一个单独的连接模型时,通常使用':has_many:through'关联。 – 2010-03-16 20:26:24