Rails способ скрыть неопубликованные вещи

#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 вызовет исключение, если ничего не найдено, по умолчанию оно соответствует желаемому поведению.