#ruby-on-rails #activemodel
#ruby-on-rails #activemodel
Вопрос:
Я немного застрял с чем-то, что я ранее делал бесчисленное количество раз в Node или Django.
Я создаю приложение Rails только для API.
Допустим, у меня есть Post
модель, содержащая сообщения в блоге. Модель имеет published
атрибут, который определяет, доступна ли определенная запись уже широкой публике.
Очевидно, что цель контроллера — вернуть JSON сообщения (сообщений), если флаг имеет значение true.
Для коллекций я создал простую область в своей модели Post следующим образом:
scope :published, -> { where(published: true) }
Однако для отдельных запросов я не уверен, что является правильным, или, скорее,: Rails способ обработки этого. Я могу «вытеснить это», но я чувствую, что для подобных вещей есть аккуратный трюк «соглашение о конфигурации».
По сути, мне интересно узнать о самом чистом решении для этого: если опубликованный атрибут post имеет значение true, верните объект post, если он false, верните 404
Должен ли я смотреть на области видимости? Сериализаторы? Где спрятано сокровище?
Спасибо за вклад!
Ответ №1:
Нет золотой пули, но использование областей в порядке.
В вашем контроллере у вас, вероятно, есть что-то похожее на это:
post = Post.find(params[:post_id])
Теперь использование вашей published
области будет работать так, как ожидалось (его вид / результаты в SQL AND
):
post = Post.published.find params[:post_id]
Он не будет сначала запрашивать все опубликованные сообщения из базы данных, а затем просматривать их. Прелесть конкретного ORM (выполнение сопоставлений code object <-> database) здесь заключается в том, что в итоге вы получите один запрос к своей базе данных (как видно из файлов журнала).
Возврат 404 или чего-то еще зависит от вас / ваших контроллеров — as find
вызовет исключение, если ничего не найдено, по умолчанию оно соответствует желаемому поведению.