Rails 3 — извлечение последних N записей

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

У меня есть модель, которая собирает финансовые данные от моих клиентов каждый календарный квартал каждого года (так: квартал 1, 2, 3 и 4 для любого заданного года). Для простоты модель называется Quarter и имеет атрибуты :client_id , :quarter , :year и :amount . Я хочу иметь возможность запрашивать и отображать последние четыре записи для атрибута:amount на основе квартала, который отображается в данный момент.

Так, например, если я смотрю на: квартал 3 за: 2011 год, то я хочу показать: сумму за текущий квартал (что легко), а также: сумму за: квартал 2 и 1 за: 2011 год и: квартал 4 за: 2010 год. Имеет ли это смысл?

Я выполнил эту работу, присвоив каждой записи, которую я хочу получить, другую переменную, а затем используя операторы elsif, чтобы найти ее, но я знаю, что должен быть более чистый способ сделать это.

Как мне это сделать?

Ответ №1:

Для извлечения последних N записей :

 Quarter.last(n).reverse
  

Ответ №2:

с помощью интерфейса запросов Rails 2.x ответ:

 Quarter.find(:all, :order => :year, :limit => 4).reverse
  

с помощью интерфейса запросов Rails 3.x ответ:

 Quarter.order(:by => :year).limit(4).reverse
  

кстати. Я думаю, вам не следует хранить свои данные в модели с именем «Quarter», а скорее в модели с именем «FinancialData», и у этой модели есть атрибут «quarter», который будет содержать 2011/1, 2011/2 или иметь два атрибута: year и:quarter, которые необходимо индексировать вместе

Смотрите также:

http://guides.rubyonrails.org/active_record_querying.html

http://m.onkey.org/active-record-query-interface

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

1. Классный человек, спасибо. Извините, я действительно новичок в этом, как тогда я мог бы поместить это в свое представление, чтобы показать только записи для атрибута:amount ?

2. проверьте этот веб-сайт: railscasts.com — в нем есть действительно полезные эпизоды — некоторые на начальном уровне, некоторые на продвинутом. Возможно, найдите там «Просмотр».

3. Еще раз спасибо, Тило. То, что я сделал, это просто присвоил переменную этому запросу в моем контроллере, что-то вроде: @lastfouritems = query, затем отобразил эту переменную в моем представлении. Однако он показывает все атрибуты для моей модели в огромном списке, а не только атрибут:amount . Как мне изолировать этот один атрибут и показывать только это?

4. @lastfouritems[i].сумма, где i = 0..3 , или вы можете использовать цикл each для прохождения по массиву. Если вы хотите иметь массив только с суммами, вы можете выполнить @lastfouritems.map(amp;:amount)

5. Спасибо, я попробую, но пока я на 90% продвинулся.

Ответ №3:

 User.all.order("id desc").limit(40)