Find(next)

Domanda banale per chi lo sa.
Esiste un metodo tipo scheda.find(:next) per posizionarsi al prossimo
record in base ad un determinato ordine?

Per essere più chiaro:
Sono posizionato su una scheda con id 56
clicco sul link next e mi visualizza la 57

BM

On 9/9/06, Biagio M. [email protected] wrote:

Domanda banale per chi lo sa.
Esiste un metodo tipo scheda.find(:next) per posizionarsi al prossimo
record in base ad un determinato ordine?

Per essere più chiaro:
Sono posizionato su una scheda con id 56
clicco sul link next e mi visualizza la 57

Forse potresti usare:
find(:first, :conditions => [“id > ? 57”])

On 9/9/06, Biagio M. [email protected] wrote:

Domanda banale per chi lo sa.
Esiste un metodo tipo scheda.find(:next) per posizionarsi al prossimo
record in base ad un determinato ordine?

Per essere più chiaro:
Sono posizionato su una scheda con id 56
clicco sul link next e mi visualizza la 57

Ti basterebbe usare Scheda.find(id). Dove id e’ il numero che passi come
parametro all’azione quando fai click su ‘next’ (in questo caso 57).
Ovviamente il problema di questo approccio è che, se non hai già determinato
quale è il prossimo id, non puoi usarlo. (potrebbe essere 63 ad esempio,
se
un esiguo numero di records successivi a 56 sono già stati cancellati).
Scheda.find(:first, :conditions => [“id > ?”, 56]) dove 56 è l’id della
pagina corrente dovrebbe fare al caso tuo.

Più in generale, puoi sempre definire un offset e/o un limit per le tue
query, in modo tale da avere maggiore controllo sul posizionamento tra i
risultati ad esempio:

Scheda.find(:all, :offset => 5, :limit => 10)

In realtà quando indichi l’argomento :first in un metodo find, stai
implicitamente applicando un :limit => 1. Infatti la query sql generata
avrà
la condizione LIMIT 1 (nel caso di MySQL, per DB2 questo equivale a
FETCH
FIRST 1 ROWS ONLY).

Ciao,
Antonio

Andrea F. wrote:

Forse potresti usare:
find(:first, :conditions => [“id > ? 57”])

Dalle risposte devo arguire che non vi è niente di già implementato.

In pratica in Delphi (per esempio) posso richiamare i seguenti metodi:
Scheda.Bof; // controllo inizio
Scheda.Eof; // … fine
Scheda.Next; // posiziona su prossimo
Scheda.Prev; // … su precedente
Scheda.First;// … primo
Scheda.Last;// … ultimo
ecc.
da usare per esempio in questa maniera:
while (not Scheda.Eof) do
begin
// fai qualcosa;
Scheda.Next;
end;
Tranne che per Scheda.First, in Rails, gli altri me li devo in qualche
modo implementare. Dico bene ?.
BM

Biagio M. wrote:

Andrea F. wrote:

Forse potresti usare:
find(:first, :conditions => [“id > ? 57”])

Dalle risposte devo arguire che non vi è niente di già implementato.

Potrei implementare Next in questo modo:
Requirement = Scheda dell’esempio precedente.

class ApplicationController < ActionController::Base
def memorizza_id_richiesta(id_richiesta)
$id_richiesta = id_richiesta # come evitare la variabile globale ?
end
end
class AdminController < ApplicationController
def show
@requirement = Requirement.find(params[:id])
memorizza_id_richiesta(@requirement.id)
end
def show_next
@requirement = Requirement.find(:first, :conditions => [“id >
#{$id_richiesta}”], :order => “id”)
memorizza_id_richiesta(@requirement.id)
end
end
E per quanto riguarda Eof e Bof ? ( per .es. se vado oltre l’ultimo
record avrò un errore)
Certamente si può fare meglio.
BM

Dalle risposte devo arguire che non vi è niente di già implementato.

In realtà Modello.find :all ritorna un array, xciò esistono già i
metodi first e last,
e puoi iterare i vari record con each…
Usando rails il problema non viene da activerecord ma essenzialmente
dal protocollo http che è stateless…xciò se hai una pagina che
visualizza un record e clicchi su un link “next” che ti manda ad un
altra azione, non puoi visualizzare il prossimo record usando quei
metodi semplicemente xkè nn hai più in memoria i risultati precedenti.
Potresti fare:

def show
if params.include?(:next_of)
@requirement = Requirement.find(:first, :conditions => [‘id > ?’,
params[next_of], :order => ‘id’)
else
@requirement = Requirement.find(params[:id])
end
end

…magari c’è qlche errore xkè nn l’ho testato :slight_smile:

-pilu

Biagio M. wrote:

Biagio M. wrote:

Andrea F. wrote:

E per quanto riguarda Eof e Bof ? ( per .es. se vado oltre l’ultimo
record avrò un errore)
In questo modo controllo il fine file:

def show_next
flash[:notice] = “#{$id_richiesta}”
#@requirement = Requirement.find((params[:id].to_i + 1).to_s)
if @requirement = Requirement.find(:first, :conditions => [“id >
#{$id_richiesta}”], :order => “id”)
memorizza_id_richiesta(@requirement.id)
else
redirect_to :controller => ‘admin’, :action => ‘show’, :id =>
$id_richiesta
end
end

BM

@requirement = Requirement.find(:first, :conditions => ['id > ?',

params[next_of], :order => ‘id’)

Se il risultato è nil vuol dire che hai superato l’ultimo…

Andrea F. wrote:

Dalle risposte devo arguire che non vi � niente di gi� implementato.

In realt� Modello.find :all ritorna un array, xci� esistono gi� i
metodi first e last,

mi era sfuggito quanto sopra first e last di array

Andrea F. wrote:

@requirement = Requirement.find(:first, :conditions => ['id > ?',

In realt� Modello.find :all ritorna un array, xci� esistono gi� i
metodi first e last,
non ho trovato documentazione di questi first e last dove guardo ?.
Comunque questo funziona anche se credo, con esperienza che non ho, si
possa fare meglio :
def show_next
if @requirement = Requirement.find(:first, :conditions => [“id >
#{$id_richiesta}”], :order => “id”)
memorizza_id_richiesta(@requirement.id)
redirect_to :controller => ‘admin’, :action => ‘show’, :id =>
@requirement.id
else #Se il risultato nil vuol dire che hai superato l’ultimo…
redirect_to :controller => ‘admin’, :action => ‘show’, :id =>
$id_richiesta
end
end

def show_prior
if @requirement = Requirement.find(:first, :conditions => [“id <
#{$id_richiesta}”], :order => “id DESC”)
memorizza_id_richiesta(@requirement.id)
redirect_to :controller => ‘admin’, :action => ‘show’, :id =>
@requirement.id
else
redirect_to :controller => ‘admin’, :action => ‘show’, :id =>
$id_richiesta
end
end
Proverò il tuo codice.

Ciao

On 09/09/06, Biagio M. [email protected] wrote:

Domanda banale per chi lo sa.
Esiste un metodo tipo scheda.find(:next) per posizionarsi al prossimo
record in base ad un determinato ordine?

Se si puo’ applicare al caso tuo (ovvero, usi rails o almeno
ActiveRecord) e se non ti secca che il metodo si chiami higher_item
invece di next, forse potresti usare

acts_as_list :scope => :id

se ho capito bene.

Ciao

E i Pagination?

Allora non ho capito bene, o te o il problema!

:frowning:

E i Pagination?


David N. Welton

Linux, Open Source Consulting