Рельсы, отслеживание последних просмотров? Мысли о реализации сортируемого списка - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть проекты в моем веб-приложении ...

Пользователь может иметь, скажем, 10 или более проектов в данной точке. Когда я выведу список проектов пользователя, я бы хотел, чтобы этот список упорядочивался по их последнему виду. Значение в верхней части списка проектов пользователя - это проект, который они недавно посещали, а внизу - проект, который они посетили последним.

Какой лучший способ сделать что-то подобное? У меня есть таблица разрешений, которая управляет разрешениями проекта пользователя. Я думал добавить его туда, но это может быть грязно или неуместно, IDK, я рад услышать ваши мысли по этому поводу.

Кроме того, в какой-то момент я хотел бы дать пользователю возможность переупорядочивать свои списки проектов, как ручное переопределение, используя плагин jQuery UI, такой как Sortable. Кто-нибудь когда-нибудь реализовывал плагин типа Sortable для Rails?

спасибо !!!

Ответы [ 3 ]

2 голосов
/ 01 ноября 2010

Поскольку Проекты являются первоклассными гражданами вашего приложения, они заслуживают самого пристального внимания - вероятно, не стоит пытаться втиснуть некоторые их аспекты в модель разрешений, которая имеет другое назначение.

Поскольку в проектах может быть много пользователей, а у пользователей может быть много проектов, вам необходимо добавить между ними модель таблицы «многие ко многим».Например,

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.(Сейчас исправлено.)

0 голосов
/ 16 мая 2013

Вы спрашивали об использовании Sortable JQuery-UI в Rails. Это отличный ресурс для настройки этого в вашем приложении: # 147 Сортируемые списки (исправлено) . Я использовал это для реализации Sortable в приложении, и это работало без особых усилий.

Я думаю, что Ларри К. прав: вы должны добавить атрибут "last_viewed" в модель вашего проекта. Вам также понадобится атрибут "position", если вы хотите использовать сортируемое.

Удачи!

0 голосов
/ 01 ноября 2010

Я не уверен, что есть «лучший» способ добиться этого, простой способ - ввести таблицу user_project_view (project_id, date, user_id, override_order) с первичным ключом на (project_id, user_id) и просто обновить эту таблицу, когда пользователь смотрит напроект.

Затем на дисплее присоединитесь и сортируйте по этой таблице.(вы можете заказать на [override_order, date] - что позволит пользователям переопределять заказ, если они пожелают)

Для заказа на пользователя вы можете использовать что-то вроде act_as_list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...