Rails: рефакторинг кода для СУХОГО метода

#ruby-on-rails #ruby #arrays

#ruby-on-rails #ruby #массивы

Вопрос:

У меня есть некоторый код, в котором я перебираю фрагменты данных, и мне приходится писать один и тот же код несколько раз, и я хочу «ВЫСУШИТЬ его».

Вот часть кода:

 <%= raw @artist["albums"]["Albums"].uniq_by{ |a| a["Genre"] }.collect { |album| link_to album["Genre"], genre_path(CGI::escape(album["Genre"])) unless album["Artist"]["Name"] != @term }.join(" ") %>
  

Часть, которую мне приходится дублировать несколько раз, — это конец unless album["Artist"]["Name"] != @term , есть ли способ фильтровать массив лучше, чем каждый раз писать это выражение unless?

надеюсь, это имеет смысл

Я смог сократить код, удалив uniq_by

 <%= raw @artist["albums"]["Albums"].collect { |album| link_to album["Genre"], genre_path(CGI::escape(album["Genre"])) unless album["Artist"]["Name"] != @term }.uniq.join(" ") %>
  

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

1. Ну, вы могли бы написать вспомогательный метод, но я думаю, вам нужно пересмотреть эту строку кода с самого начала. Чего вы пытаетесь достичь?

2. ну, я пытаюсь собрать все уникальные жанры, где имя исполнителя равно @term переменной … извините, если код неаккуратный .. все еще изучаю Ruby: P

3. Итак, вам просто нужен список жанров исполнителя?

4. да, по сути, они просто должны быть уникальными, чтобы удалять дубликаты

5. Ну, вы можете сделать это с @artist.genres.uniq.map{|genre| genre.title}.join(",") помощью или чего-то подобного, если вы правильно настроили ассоциацию.

Ответ №1:

Похоже, вы эмулируете ГРУППУ ПО запросу в своем представлении. В частности, ваше @term предложение выглядит как WHERE условие или ограничение соединения.

Если у вас есть модель альбома, я бы добавил одну или несколько именованных областей, представляющих части запроса, а затем просто объединил их вместе в вашем представлении (с a collect в конце для форматирования тегов ссылок.)