Rails:按关联排序,首先不下载

时间:2015-08-04 12:57:48

标签: ruby-on-rails ruby postgresql associate

显示通过我的应用程序可访问的文件时出现问题。当用户登录时,我想显示他们的所有文件。当前用户下载的文件应最后显示。文件表有大约500条记录,所以我需要简单快捷的方法来实现这一目标。

class User
  has_many :downloads
  has_many :downloaded_files, :through => :downloads, source: :file
end

class File 
  attr_accessor :downloaded

  has_many :downloads
  has_many :users, :through => :downloads
end

class Download
  belongs_to :user
  belongs_to :file
end

我正在使用的技术

  • Rails 4.2.1
  • Ruby 2.2.2
  • 的PostgreSQL

1 个答案:

答案 0 :(得分:0)

老实说,我认为没有必要过度思考这个问题。五百条记录在数据库负载方面没有任何意义,因此只需触发两个查询:

您的控制器代码

# Current user files
@user_files = current_user.downloaded_files

# Select all files which don't have Download record for current user
@other_files = File.where("NOT EXISTS (SELECT 1 FROM downloads WHERE file_id = files.id AND user_id = ?)", current_user.id)

然后在您的视图中依次使用@user_files和@other_files。像

这样的东西

您的观点代码

<%= render partial: 'files', collection: @other_files %>
<%= render partial: 'files', collection: @user_files %>

<强> UPD

使用Where Exists gem(披露:我最近发布了它),您可以简化控制器代码。

而不是:

@other_files = File.where("NOT EXISTS (SELECT 1 FROM downloads WHERE file_id = files.id AND user_id = ?)", current_user.id)

你可以这样写:

@other_files = File.where_not_exists(:downloads, user_id: current_user.id)