Rails: заказ по партнеру, сначала не загружен

У меня проблема с отображением файлов, доступных через мое приложение. Когда пользователь входит в систему, я хочу отобразить все свои файлы. Файлы, загруженные текущим пользователем, должны отображаться последними. Таблица файлов содержит около 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 ответ

Решение

Честно говоря, я не вижу необходимости обдумывать эту проблему. Пятьсот записей - ничто с точки зрения загрузки БД, поэтому просто запустите два запроса:

Код вашего контроллера

# 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 (раскрытие: я недавно его выпустил), вы можете упростить код вашего контроллера.

Вместо этого:

@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)
Другие вопросы по тегам