#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 .