Задать вопрос
b0nn1e
@b0nn1e
Alcohol & Ruby on Rails

Как сделать has_and_belongs_to_many с сортировкой?

Подскажите пожалуйста как реализовать следующую задумку.
Есть 3 модели.
Video, Product и Product_group.
Product и Product_group имеют много Video. Одно Video может принадлжеать 0 или больше Product и/или Product_group, но проблема не в этом, а в том что должен быть порядок у видео который можно изменять.
К примеру есть 5 Видео (id 1..5)
Есть Товар 1 к которому относятся видео 4,1,3
Есть Товар 2 к которому относятся видео 5,2
Есть Группа товаров к которой относятся видео 1,5.
и тд.
В частично мою проблему решает has_and_belongs_to_many и две связующих таблицы
products_videos
t.integer "product_id"
t.integer "video_id"
и
product_groups_videos
t.integer "product_group_id"
t.integer "video_id"

Однако ума не приложу как сюда еще добавить сортировку. Можно добавить в обе таблицы t.integer "position" однако как это значение изменять и как по нему сортировать?

Две отдельных модели для связки с has_many :through не хочетcя делать, ради одного столбца сортировки.

Наставьте пожалуйста на путь истинный :)
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
viktorvsk
@viktorvsk
Забыть про has_and_belongs_to_many
Вместо него взять has_many through:
Сделать модель ProductVideo, где будте position
Ответ написан
Комментировать
Jeiwan
@Jeiwan
Видится только такое решение: добавить в таблицы products_videos и product_groups_videos колонку position, в которую сохранять порядковый номер видео в списке. То есть для этого примера:
Есть Товар 1 к которому относятся видео 4,1,3
у видео 4 position = 0, у видео 1 position = 1, у видео 3 position = 2 (точнее не у самих видео, а у записей в таблицах-связках). И потом сортировать по этой колонке.
А позиции эти можно задавать при создании товара и группы. Или вообще сделать, чтобы они автоматически проставлялись в зависимости от порядка загрузки видео.
По поводу выборки, должно получится что-то вроде этого: Product.find(1).videos.order('product_videos.position') — но я не уверен, что тут будет доступна product_videos для сортировки, не помню, какой запрос делается при has_and_belongs_to_many.

Всё это в теории, но, по идее, должно сработать. :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы