2011-08-10 16 views
10

Mogę znaleźć ostatni rekord w mojej tabeli, tak jak w przykładzie poniżej, ale co jeśli chcę znaleźć rekord przed ostatnim, np. (ostatnie-1) lub (ostatnie-2) ..? mam ten przykład w moim każdej pętli:Szyny: jak znaleźć rekord przed ostatnim?

Table.find(:last, :conditions => {:dogovor_id => p.id}).id 

Odpowiedz

19
Table.where(:dogovor_id => p.id).order("id DESC").first   # last 
Table.where(:dogovor_id => p.id).order("id DESC").offset(1).first # last - 1 
Table.where(:dogovor_id => p.id).order("id DESC").offset(2).first # last - 2 
+0

Dzięki! To działa! :) –

13

Innym łatwiejsze do zapamiętania sposób to: Model.last(2).first

+0

Ja raczej to niż zaakceptowany –

2

Można użyć ujemnych indeksów.

Drugi do ostatniego elementu ma wskaźnik -2:

Model.all[-2] 

10 do ostatniego:

Model.all[-10] 

W szyn 5 przedostatni formy do [-2] i [-3]have aliases. Więc jeśli chcesz, użyj tego:

Model.second_to_last 
Model.third_to_last 
0

Nawet jeśli zaakceptowane odpowiedź działa:

Table.where(:dogovor_id => p.id).order("id DESC").first   # last 
Table.where(:dogovor_id => p.id).order("id DESC").offset(1).first # last - 1 
Table.where(:dogovor_id => p.id).order("id DESC").offset(2).first # last - 2 

„pierwszy” metoda to metoda tablicą, więc dotyczące jej lepiej użyć „granica” metodę wykonania, które jest metoda ActiveRecord i dołącza klauzulę LIMIT do zapytania SQL:

Table.where(dogovor_id: p.id).order(id: :desc).offset(1).limit(1) # last - 1 
Powiązane problemy