2010-07-07 3 views
22

Если у меня есть следующие,Limit каждый сделать цикл

<% @feed.sort_by{|t| - t.created_at.to_i}.each do |feed| %> 

<% end %> 

Как ограничить его только показать 10 последних результатов

+3

Почему ты просто не сортировать первый, а затем нарежьте массив, чтобы получить первые 10? –

ответ

60
<% @feed.sort_by{|t| - t.created_at.to_i}.first(10).each do |feed| %> 

Однако, это вероятно, лучше всего подтолкнуть его к модели, подобной этому

<% @feed.recent(10).each do |feed| %> 

И, в самом деле, если @feed выходит из базы данных, я бы оттолкнул его еще дальше: не имеет смысла загружать тонну несортированных входных данных из базы данных, а затем сортировать их и затем выбросьте большинство из них. Лучше позвольте БД выполнять сортировку и фильтрацию.

См. Ответ @Peer Allan о том, как это сделать в ActiveRecord. В ARel (IOW: Rails 3) это, вероятно, будет еще проще, что-то вроде

Feed.all.order('created_at DESC').take(10) 
+0

Если я хочу использовать '@ feed' дважды: один, чтобы показать 10, другой, чтобы показать все, лучше ли мне ограничить его взглядом с помощью' recent (10) ', затем следующий обычный нормальный цикл для' @feed '. – Victor

8

Я согласен с другими (Йорг в частности); но если вы все еще хотите знать, как ограничить сам цикл, может оказаться полезным break.

@array.each_with_index do |feed, i| 
    break if i == 10; 
    # ... 
+0

Есть гораздо лучшие методы ограничения количества отображаемых элементов, чем разрыв цикла: 'first' и' [] 'оператор работают очень хорошо в таком сценарии. –

+0

Я не знаю о «лучше», но другие ответы, безусловно, приятнее, о чем я конкретно говорю. «Лучше» очень ситуативно; Я мог бы указать, что методы, которые вы предлагаете, создают новый массив, а мой - нет. Дело в том, что, поскольку другие ответы уже были сосредоточены на ограничении самой коллекции, я ответил только на буквальный вопрос, добавив еще один вариант: предполагая цикл по всей коллекции, как работать только в 10 раз макс. Это не решение, которое я бы выбрал, если бы меня не нажимали на время, поскольку он делает код более уродливым. – Amadan

+0

Да, в основном это дело стиля. Но если есть прямая концепция, выражающая намерение программиста (например, 'first',' [] 'и' order (...). Take (10) 'особенно), я лично считаю более привлекательным его использовать. –

5

Созданный_at, кажется, указывает, что вы используете ActiveRecord в Rails для установки переменной @feed. Если это так, вам лучше сделать эту работу в SQL. Его гораздо эффективнее и легче справиться.

@feed = Feed.all(:order => 'created_at DESC', :limit => 10) 

В противном случае, если вы действительно хотите использовать представление, чтобы сделать это, вы можете использовать первый или диапазон

<% @feed.sort_by{|t| - t.created_at.to_i}[0..9].each do |feed| %> 
<% @feed.sort_by{|t| - t.created_at.to_i}.first(10).each do |feed| %> 
6

Следующий код будет возвращать 10 последних записей.

@feed = @feed.sort! { |a,b| b.created_at <=> a.created_at }.take(10) 

Array Reference

+1

Awesome. Это позволяет вам ограничить _after_ выполнение сортировки.В моем случае я сортирую на самом большом количестве полиморфных ассоциаций. Я не могу написать запрос для него (не знаю, как!). Это хорошо работает. – mattd

9

Я хотел бы сделать это следующим образом:

<% @array.limit(10).each do |a| %> 
Смежные вопросы