найдите следующую и предыдущую строки объекта activerecord

#ruby-on-rails

#ruby-on-rails

Вопрос:

В моем приложении rails у меня есть следующая функция на одной из моих страниц контроллера.

 def tree
@jstree = Sub.find_by_sql("Select sequence, depth, node, imageid, range from.....several joins")
end
 

Теперь я хочу перебрать результирующий набор и выполнить некоторые действия в зависимости от значения предыдущей и следующей строки.

 <% @jstree.each do |tree| %>
<%= tree.sequence %>
<% end %>
 

Я хотел бы знать, как получить значение следующей и предыдущей строки в приведенном выше цикле

Большое, большое спасибо за все предоставленные предложения 🙂

Ответ №1:

Это зависит от того, как вам на самом деле нужно его использовать (и, очевидно, первая и последняя записи не будут иметь элементов previous / next).

Если вы это сделаете each_with_index , у вас есть индекс и вы можете использовать обычный доступ к массиву:

 @jstree.each_with_index do |elem, n|
    prev_elem = @jstree[n-1] unless n == 0
    next_elem = @jstree[n 1] unless n == @jstree.size-1
    # Etc.
    do_stuff_with_next if next_elem # Or
    if next_elem
        do_stuff
        do_other_different_stuff
    end
end
 

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

1. nextElem.depth выдает сообщение об ошибке. неопределенный метод `depth’ для nil:NilClass

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

3. @Dave: переменные в верблюжьем корпусе режут мне глаза 🙂 @tanya: когда вы находитесь на последнем элементе nextElem , nil очевидно, будет.

4. @Dave: Большое вам спасибо. Сейчас это работает отлично. Условие ‘if next_elem’ отсутствовало, вот почему я получал вышеупомянутую ошибку. Приветствия

Ответ №2:

Не знаю, соответствует ли это вашим потребностям: @jstree.each_with_index do |tree, index| и затем вы можете найти предыдущий и следующий по @jstree[index-1] и @jstree[index 1] (не забудьте проверить, находитесь ли вы на первом или последнем элементе).

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

1. Если вы находитесь на последнем элементе внутри @jstree или всегда?

Ответ №3:

Вместо этого вы могли бы просто использовать each_with_index:

 @jstree.each_with_index do |item, index|
...
 

Или, если вам нужно что-то более сложное, вот плагин, который выглядит для этого: acts_as_ordered .