Как элегантно проверить наличие объекта и связанных объектов? - PullRequest
0 голосов
/ 28 января 2019

У меня есть переменная экземпляра @tally_property, и если на этом объекте есть photos, я бы хотел просмотреть фотографии и просмотреть их.

Поэтому мой фрагмент кода выглядит следующим образом:

<% if @tally_property.photos.present? %>
   <% @tally_property.photos.each_with_index do |photo, index| %>

Проблема заключается в том, что на основании вышеизложенного, если @tally_property равно nil, тогда вся первая строка выдает ошибку.

Так что, есть проверка 'nil', я могу это сделатьне громоздкий, т. е. я не хочу делать if @tally_property.nil? как для основного объекта, так и для ассоциации, а также элегантен, рубиновый и рельсовый?

Ответы [ 4 ]

0 голосов
/ 29 января 2019

Еще один способ, просто выберите все фотографии, связанные с этим tally_property:

пример того, как это может быть:

Photo.joins (: tally_property) .each_with_index do | photo, index |

0 голосов
/ 28 января 2019

Я бы использовал оператор безопасной навигации (&.) и написал бы что-то вроде этого:

<% @tally_property&.photos&.each_with_index do |photo, index| %>
  ... 
<% end %>
0 голосов
/ 28 января 2019

В Ruby 2.3.0+ вы можете использовать оператор безопасной навигации:

@tally_property&.photos

ActiveSupport имеет метод .try, который можно использовать с той же целью в более старых версиях ruby:

@tally_property.try(:photos)

Вы можете добавить простое условие, чтобы можно было безопасно перебирать коллекцию:

<% (@tally_property.try(:photos)||[]).each_with_index do |photo, index| %>

<% end %>

Rails 4 добавляет ActiveRecord::Relation#none и изменение поведения, так что ассоциации всегда возвращают ActiveRecord::Relation.Поэтому вполне приемлемо написать:

<% @tally_property.try(:photos).try(:each_with_index) do |photo, index| %>

<% end %>

После обновления вашего приложения.Или вы можете использовать частичное и рендер:

<%= render partial: 'photos', collection: @tally_property.photos if @tally_property %>

, что устраняет необходимость в написании итерации.

0 голосов
/ 28 января 2019

Используйте && (или and, у каждого из них есть своя сладость).

Если на мгновение вытащить его из Эрба, я бы вообще написал что-то вроде этого:

if @tally_property and @tally_property.photos.present?

В зависимости от photos я мог бы использовать:

if @tally_property and @tally_property.photos

или, возможно:

if @tally_property and not @tally_property.photos.empty?

Иногда я буду использовать временную переменную:

if (photos = @tally_property && @tally_property.photos)
  photos.each #…

Такого рода вещи.

Я бы порекомендовал этот эпизод Руби Тапаса, И / или , для более длинного (но все же быстрого) взгляда на него.

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