【发布时间】:2016-04-21 12:21:41
【问题描述】:
我有一个带有video_id、user_id 和其他一些简单字段的Work 模型。我需要在页面上显示最后 12 个作品,但每个用户只需要 1 个。目前我正在尝试这样做:
def self.latest_works_one_per_user(video_id=nil)
scope = self.includes(:user, :video)
scope = video_id ? scope.where(video_id: video_id) : scope.where.not(video_id: nil)
scope = scope.order(created_at: :desc)
user_ids = works = []
scope.each do |work|
next if user_ids.include? work.user_id
user_ids << work.user_id
works << work
break if works.size == 12
end
works
end
但我敢肯定,有一种更优雅、更快捷的方法,尤其是当作品数量越来越多时。
【问题讨论】:
-
能否将问题重述为“显示最近 12 位创作过一件或多件作品的用户的作品 1?”
-
你可以这样说。但是我无法从 User 模型中判断出用户最近有没有创作过任何作品。
-
您使用的是什么数据库?使用更复杂 SQL 的解决方案可能是特定于数据库的。
-
另外,作为记录,您的内存实现中有一个错误:
user_ids和works被初始化为相同的Array;它们都应该被初始化为单独的Arrays。如果您想要不同的实现,这并不重要。
标签: sql ruby-on-rails ruby ruby-on-rails-4 rails-activerecord