我最近制作了以下模型:
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
我将在一天中定期添加进度更新,直到我弄清楚。
答案 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