我有一个user
模型,一个movie
模型以及user.rb中的这个关联(我使用has_many:through,因为这两个模型之间还有其他关联):
has_many:has_seens
has_many:movies_seen,:through => :has_seens,:source => :电影
我正在尝试获取最近创建的十个has_seens
个关联的数组。
现在,我找到的唯一解决方案是遍历所有用户,创建一个找到每个user.has_seens的数组,然后通过has_seen.created_at对数组进行排序,只保留最后10个项目......看起来像是一个繁重的操作
有更好的方法吗?
凯文
答案 0 :(得分:1)
您应该可以通过向: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)
答案 1 :(得分:0)
你可以使用find:
来做到这一点HasSeen.find(:order => 'created_at DESC', :limit => 10)
您可以使用named_scope(在HasSeen模型中),如下所示:
named_scope :recent, :order => 'created_at DESC', :limit => 10
并致电HasSeen.recent
。
如果您正在寻找用户,那么简单(但不是最有效,我只是不知道如何进行加入)的方式是recent_users = HasSeen.recent.map { |h| h.user }
如果后者是您正在寻找的,请发表评论,我会将其清理为用户模型的named_scope。