Поскольку Проекты являются первоклассными гражданами вашего приложения, они заслуживают самого пристального внимания - вероятно, не стоит пытаться втиснуть некоторые их аспекты в модель разрешений, которая имеет другое назначение.
Поскольку в проектах может быть много пользователей, а у пользователей может быть много проектов, вам необходимо добавить между ними модель таблицы «многие ко многим».Например,
class Project < ActiveRecord::Base
has_many :project_orders,
has_many :user_in_orders, # users who viewed the project, in order of view time
:class_name => "User", :through => :project_orders,
:order => "project_orders.last_viewed DESC"
class ProjectOrder < ActiveRecord::Base
# id
# user_id
# project_id
# position # default => 10000 # don't use field name of 'order'
# last_viewed
class User
has_many :project_orders,
has_many :orders, # The user's projects
:through => :project_orders,
:order => "project_orders.position, project_orders.last_viewed DESC"
После этого вы сможете составить список заказов пользователя по last_viewed (по умолчанию) с возможностью переопределения, установив поле позиции.
Поскольку вы хотите, чтобы строки с настройкой позиции сначала сортировались, мы используем очень высокое число в качестве значения позиции по умолчанию.(Определенно хак)
Добавлено в ответ на комментарий об использовании nil в качестве позиции по умолчанию:
В предложении MySQL Order by ставятся нулевые значения первыми, а не последними, с восходящей сортировкой.Поэтому, если вы хотите переопределить сортировку last_viewed путем явной установки поля позиции, вы хотите, чтобы поля позиции, которые установлены явно, имели меньшие значения, чем строки со значениями по умолчанию.Поэтому мы используем очень высокий уровень по умолчанию, например, 10000.(Предполагается, что пользователи, которые хотят явно заказать 10 000 проектов, уже столкнутся с другими проблемами.)
Другой способ сделать это - установить значение по умолчанию nil или 0 и отсортировать поле позиции по убыванию.Но поскольку цель состоит в том, чтобы иметь возможность явным образом переопределить порядок last_viewed, проще представить, что позиция 1 является первым в списке, 2 - вторым в списке и т. Д.
Кроме того, помните, что просто добавьте записи project_order будет сортировать их правильно.Самые последние просмотренные будут показаны первыми.Предложение сортировки по позиции не будет действовать в случае по умолчанию, поскольку все записей для пользователя будут иметь одинаковое значение по умолчанию для позиции.Сортировка двух записей по позиции и DESC last_viewed точно такая же, как и сортировка только по DESC last_viewed, если обе записи имеют одинаковое значение для позиции.
Re: показать последнее просмотренное первым.- Правильно, вы заметили ошибку.Я должен был включить ключевое слово DESC.(Сейчас исправлено.)