2010-03-16 81 views
2

我有一个user模型,movie模型,这个协会在user.rb(我用的has_many:通过,因为有这两种模式之间的其他协会):如何使用Rails查找两个对象之间创建的最近关联?

的has_many:has_seens
的has_many:movies_seen, :通过=>:has_seens,:source =>:电影

我试图获得最近创建的十个关联has_seens的数组。

现在,我发现的唯一解决方案是抓取所有用户,创建一个数组,每个user.has_seens找到,然后通过has_seen.created_at对数组进行排序,只保留最后10个项目...看起来像一个重操作。

有没有更好的方法?

凯文

+0

是否有您所使用的'Movie'模型作为连接表由'指定一个特别的原因:source'选项?当你想要一个单独的连接模型时,通常使用':has_many:through'关联。 – 2010-03-16 20:26:24

回答

1

您应该可以通过在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) 
+0

感谢您的回答。 “最近”的方法是有帮助的,但我已经设法得到最近十个特定用户的has_seens。我更想从数据库中获取最近的十个has_seens,在所有用户之间。 – 2010-03-16 19:08:10

+0

@凯文,看我上面的编辑。 – 2010-03-16 20:51:41

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。

相关问题