Пропустить определенные индексы, повторяя каждый и поддерживая размер группы - PullRequest
0 голосов
/ 11 июля 2019

У меня есть фрагмент кода, который в настоящее время принимает массив элементов (в данном случае сообщения блога), сортирует их числовые идентификаторы в порядке убывания, размещает их в группы по 3 и перебирает все без исключения.

Мне нужно добавить условие, при котором если blog.published равно false для любого блога, не отображать его и использовать следующий блог.

Всякий раз, когда в блоге с опубликованным значением, установленным на false, группировка будет устанавливать позицию в группе на nil,, а не заполнять ее следующей записью в блоге, оставляя некоторые группировки только с 2 или 1 блогами. вид. Я попытался увеличить индекс, заменив каждый на each_with_index и повторив значение индекса при выполнении условия, но это также приводит к той же проблеме. Вот мой текущий код.

<% @blogs.order('created_at DESC').in_groups_of(3, false).each do |group| %>
   <div class="row pt-3">
      <% group.each do |blog| %>
        <% next if blog.published == false && current_page?(root_path) %>
           <%# Do View Stuff For Each Blog Here %>
      <% end #each %>
   </div>
<% end #grouping %>

Каждая группа должна всегда иметь 3 блога и должна пропустить любой блог, для которого значение публикации установлено в false.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

@blogs = Blog.where.not(published: false).order('created_at desc').in_groups_of(3, false)

PS.Если вы делаете @blogs = Blog.all в вашем контроллере, постарайтесь не строить AR-запросы внутри вашего представления.Даже запросы не выполняются до тех пор, пока вы их не вызовете, они должны быть полностью встроены в ваш метод контроллера.

0 голосов
/ 11 июля 2019

Если я пойму, это возможное решение.В качестве примера я использую чистый Ruby и коллекцию хэшей, но легко перенести ее в Rails.

Итак, учитывая коллекцию:

posts = [ {id: 1, pub: true}, {id: 2, pub: false}, {id: 3, pub: true}, {id: 4, pub: true}, {id: 5, pub: true}, {id: 6, pub: false}, {id: 7, pub: true}, {id: 8, pub: true}, {id: 9, pub: true}, {id: 10, pub: true}, {id: 11, pub: true}, {id: 12, pub: true}, {id: 13, pub: false}, {id: 14, pub: true} ]

Использование Enumerable # each_slice и Array # reject :

groups_of_three = posts.each_slice(3).map { |group| group.reject { |h| h[:pub] == false } }

Распечатка для показа результата:

groups_of_three.each { |group| p group }

# [{:id=>1,  :pub=>true}, {:id=>3,  :pub=>true}]
# [{:id=>4,  :pub=>true}, {:id=>5,  :pub=>true}]
# [{:id=>7,  :pub=>true}, {:id=>8,  :pub=>true}, {:id=>9,  :pub=>true}]
# [{:id=>10, :pub=>true}, {:id=>11, :pub=>true}, {:id=>12, :pub=>true}]
# [{:id=>14, :pub=>true}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...