Rails ActiveRecord查询最近查看的资源

时间:2013-01-14 15:51:53

标签: ruby database-design activerecord ruby-on-rails-3.2

我最近制作了以下模型:

class User < ActiveRecord::Base
  has_many :resources
  has_many :resource_views, :through => :user_resource_views, :source => 'Resource'
end

class Resource < ActiveRecord::Base
  belongs_to :user
  has_many :resource_views, :through => :user_resource_views, :source => 'Resource'
end

class UserResourceView < ActiveRecord::Base
  attr_accessible :resource_id, :user_id
  belongs_to :resource
  belongs_to :user_id
end

现在,我希望我的home #index动作将@resources设置为current_user最近查看的资源。你怎么建议我继续?也许类似于current_user.resource_views.find(:all,:order =&gt;'created_at')?

在SQL中,我会做类似的事情:

SELECT * 
FROM Resource 
WHERE id IN (SELECT * FROM UserResourceView WHERE user_id = current_user.id)

...但是ORDER BY created_at,hmmm

我将在一天中定期添加进度更新,直到我弄清楚。

1 个答案:

答案 0 :(得分:2)

鉴于您使用的是Rails 3.x,您正在寻找的内容可能是这样的:

class User < ActiveRecord::Base
  has_many :resources
  has_many :resource_views, :class_name => 'UserResourceView'
  has_many :viewed_resources, :through => :resource_views, :source => :resource

  def recently_viewed_resources
    viewed_resources.order('user_resource_views.created_at DESC')
  end
end

class Resource < ActiveRecord::Base
  belongs_to :user
  has_many :resource_views, :class_name => 'UserResourceView'
end

class UserResourceView < ActiveRecord::Base
  attr_accessible :resource_id, :user_id
  belongs_to :resource
  belongs_to :user_id
end

要访问控制器中的集合:

current_user.recently_viewed_resources