ruby-on-rails - Rails : Order by associate, 首先未下载

标签 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

最佳答案

老实说,我认为没有必要过度思考这个问题。就数据库负载而言,五百条记录不算什么,因此只需执行两个查询:

您的 Controller 代码

# 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)

然后在您的 View 中依次使用@user_files 和@other_files。有点像

您的 View 代码

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

UPD

使用 Where Exists gem(披露:我最近发布了它)你可以简化你的 Controller 代码。

取而代之的是:

@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)

关于ruby-on-rails - Rails : Order by associate, 首先未下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31810003/

相关文章:

ruby-on-rails - 如何将公共(public)代码移至一个由其他引擎共享的 Rails 引擎?

ruby-on-rails - 从 ActiveRecord/Rails 查询中检索单个记录

ruby-on-rails - 如何降级我的 Rails 版本?

javascript - Ruby 数组到 Javascript 数组

ruby-on-rails - 生产模式下的 SSL 连接错误 Rails 3.2.3 瘦服务器

node.js - Sequelize – id as uuid – 使用 bulkInsert 自动创建

ruby-on-rails - 在 Rails 中创建可拖动排序列表的最有效方法是什么?

ruby - 如何模式匹配字符串中的字符串,然后将其提取到变量中

node.js - Gitlab CI 上的错误 : connect ECONNREFUSED 127. 0.0.1:5432

sql - postgres查询根据某些列的多个副本获取第一行