如何使用Rails查找在两个对象之间创建的最新关联?

时间:2010-03-16 16:30:47

标签: ruby-on-rails

我有一个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个项目......看起来像是一个繁重的操作

有更好的方法吗?

凯文

2 个答案:

答案 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。