Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Как вывести элементы двух моделей в одном списке? RAILS

Имеем две модели Video и Picture. Как вывести на странице видео и картинки вперемешку, в одном списке, отсортировав их по дате?


Ответ

Если хотите хорошо и рельсово – готовьтесь к крупным изменениям.
Я полагаю, что вы хотите достать их отсортированными средствами БД: так вы получаете целый ряд очень вкусных возможностей. Пытаться пользоваться для этого двумя разными таблицами – смертоубийство, ActiveRecord будет всеми силами противиться.
Здесь я покажу два трюка: STI и render "неоднородной" коллекции.
Из вышенаписанного напрашивается вывод: делать нужно одной таблицей. Это, впрочем, не означает, что модель должна быть одна. Добавив поле type (типа string) к своей таблице, вы получите очень занятное поведение – ActiveRecord будет в этом поле сохранять название класса модели, и при запросах будет его соблюдать. То есть, если у вас есть такие классы:
class Media < ActiveRecord::Base class Video < Media class Photo < Media
Первый класс создаётся, как обычно – не забудьте только дать ему все поля, что есть и у Video, и у Photo. А класс Video можно сделать хоть руками – ему не нужна миграция. Но если пользоваться генератором, то так:
rails g model Video --no-migration --parent Media
...то запрос на Media.all вовсе необязательно вернёт именно коллекцию объектов Media. Причём система будет следить, чтобы в поле type были только названия базового класса (который, собственно, владеет таблицей) и его наследников (непосредственных и не очень). Если туда вписать что-то неправильное, будет ошибка при попытке инстанцировать объект.
А теперь самое вкусное. Сделав вышеобозначенные классы и убедившись, что они хранятся в одной и той же таблице (по генерируемым запросам), сделайте в контроллере это:
@medias = Media.all # Потом вы это захотите разбить на страницы. # Это можно. Потом.
Где-нибудь в виде выведите эту коллекцию следующим образом:
render @medias # Ну, а как ещё...
...добавьте partial'ы, которые он будет просить в сообщениях об ошибках и возрадуйтесь

Комментариев нет:

Отправить комментарий