Rilettura record

Come posso visualizzare un record appena salvato
con il relativo id generato?

Ho questo metodo:
def create
Requirement.new(params[:requirement])) #
@requirement = Requirement.new(params[:requirement])
@requirement.data = DateTime.now #
@requirement.status = 0 #
if @requirement.save
flash[:notice] = 'Richiesta inviata con Id: ’ …
redirect_to :action => ‘index’
else
render :action => ‘new’
end
end
se è stato salvato ne voglio visualizzare l’id.

Come posso fare?
Grazie per la risposta.
BM

Ti direi di aggiungere nel modello una cosa del tipo:

def self.last_insert_id
find_by_sql “SELECT LAST_INSERT_ID()”
end

e poi nel controller

if @requirement.save
flash[:notice] = “Richiesta inviata con Id:
#{@requirement.last_insert_id}”

Occhio ad una cosa che se il database riceve piu’ richieste concorrenti
o fa insert su piu’ tabelle il last_insert_id potrebbe essere non
corretto. Quindi dipende dall’uso che ne fai :wink:
Cmq questo e’ se usi MySQL.

per postgres c’e’ gia’:
http://railsmanual.com/class/ActiveRecord%3A%3AConnectionAdapters%3A%
3APostgreSQLAdapter/last_insert_id

ciao

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

if @requirement.save

Biagio, semplicemente: @requirement.id

Ciao,
Antonio

On Mer, Agosto 9, 2006 17:39, tele wrote:

Occhio ad una cosa che se il database riceve piu’ richieste
concorrenti
o fa insert su piu’ tabelle il last_insert_id potrebbe essere non
corretto.

Si potrebbe usare una transazione ed fare una query per l’ultimo id
inserito prima del commit, così stai sicuro che ottieni quello relativo al
tuo inserimento.

Nico

Antonio C. wrote:

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

if @requirement.save

Biagio, semplicemente: @requirement.id

Già provato
@requirement.id risulta nil
comunque grazie

Occhio ad una cosa che se il database riceve piu’ richieste concorrenti
o fa insert su piu’ tabelle il last_insert_id potrebbe essere non
corretto. Quindi dipende dall’uso che ne fai :wink:
Cmq questo e’ se usi MySQL.

Il problema è proprio questo, ho bisogno dell’effettivo id
del record inserito, se lo vado a rileggere non ho garanzia che
sia proprio quello.
Dovrei recuperare l’id nel momento in cui è generato.
Sono nuovo con Rails e web , vengo da Delphi e C++ e di solito
scindo la registrazione in due fasi: genero l’id lo salvo in variabile
opportuna
e poi salvo il record. Quindi rileggo tramite la variabile che contiene
l’id
(uso firebird)
Grazie comunque …se hai qualche idea …

---------- Forwarded message ----------
From: Antonio C. [email protected]
Date: Aug 9, 2006 5:49 PM
Subject: Re: [ruby-it] Rilettura record
To: [email protected]

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

if @requirement.save

Biagio, semplicemente: @requirement.id

Come ha detto saggiamente Antonio, ti basta semplicemente usare @
requirement.id dopo che hai salvato il modello, in quanto ti carica
l’id
che tu stai cercando in @requirement proprio dopo il salvataggio.

–Andrea R.

— Biagio M. [email protected] ha scritto:

Antonio C. wrote:

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

if @requirement.save

Biagio, semplicemente: @requirement.id

Già provato
@requirement.id risulta nil
comunque grazie

allora c’è un problema, temo, e la pagina non è
davvero salvata:

p=Page.new
=> #<Page:0xb76ce6d8 @new_record=true,
@attributes={“updated_at”=>nil, “title”=>“”,
“created_at”=>nil}>
p.save
=> true
p.id
=> 383
class Page
validates_length_of :title, :minimum=>10
end
=>
[#Proc:0xb7abc560@/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:296,
:validate_associated_records_for_revisions]
p=Page.new
=> #<Page:0xb76977c8 @new_record=true,
@attributes={“updated_at”=>nil, “title”=>“”,
“created_at”=>nil}>
p.save
=> false
p.id
=> nil

tra l’altro, non c’è bisogno che imposti la data a
mano, basta che usi gli attributi speciali
created_at/created_on/updated_at/updated_on, se
esistono queste colonne nella tua tabella vengono
modificate automaticamente.


icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca

Si potrebbe usare una transazione ed fare una query per l’ultimo id
inserito prima del commit, cos� stai sicuro che ottieni quello relativo al
tuo inserimento.

Mentre eseguo commit potrebbero essere arrivate altre richieste
che hanno cambiato il generatore.
Allo start della transazione non credo di potermi riservare l’id.

BM

gabriele renzi wrote:

— Biagio M. [email protected] ha scritto:

Antonio C. wrote:

allora c’� un problema, temo, e la pagina non �
davvero salvata:

Il record risulta perfettamente salvato.
Credo che dopo essere salvato venga ripulito.
BM

Andrea R. wrote:

---------- Forwarded message ----------

Come ha detto saggiamente Antonio, ti basta semplicemente usare @
requirement.id dopo che hai salvato il modello, in quanto ti carica
l’id
che tu stai cercando in @requirement proprio dopo il salvataggio.

–Andrea R.
Come dicevo ho gia’provato in questo modo:
class UserController < ApplicationController
def index
end
def show
@requirement = Requirement.find(@requirement.id)
end
def new
@requirement = Requirement.new
end
def create
@requirement = Requirement.new(params[:requirement])
if @requirement.save
#flash[:notice] = 'Richiesta inviata con Tichet: ’
redirect_to :action => ‘show’
else
render :action => ‘new’
end
end
end
Il record risulta salvato (lo vedo nel database) ma @requirement.id
risulta nil
e genera il seguente errore:
Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id.
è forse un problema di firebird?
BM

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

Il record risulta salvato (lo vedo nel database) ma @requirement.id
risulta nil
e genera il seguente errore:
Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id.

Questo ti dice che nell’action ‘show’ l’oggetto @requirement che passi a
Requirement.find non esiste, per cui ha valore nil.
id e’ anche una forma deprecated di object_id e, nel caso di nil,
restituisce 4.
Controlla il valore di @requirement.id dove sai che l’oggetto esiste,
cioè
nell’action ‘create’ subito dopo if @requirement.save.

Ciao,
Antonio

@requirement rappresenta la tua tupla e grazie all’ORM di ActiveRecord
puoi
sempre accedere ai singoli valori che la costituiscono.
@requirement.id va ovviamente fatto dopo che @requirement.save e’
avvenuto
con successo. Per riprendere il tuo esempio, qualcosa del genere:

if @requirement.save
flash[:notice] = 'Richiesta inviata con Id: #{@requirement.id}"

Se questo non funziona, e il record viene inserito nel tuo database, c’è
decisamente qualche problema.

Antonio

Biagio M. wrote:

def show
@requirement = Requirement.find(@requirement.id)
end
Hmm, qui @requirement sara’ nil fino a dopo l’esecuzione del metodo
find! (se lo passi come :id nella richiesta params[:id])

def create
@requirement = Requirement.new(params[:requirement])
if @requirement.save
#flash[:notice] = 'Richiesta inviata con Tichet: ’
redirect_to :action => ‘show’

redirect_to :action => ‘show’, :id=>@requirement

per passare l’id di @requirement

ciao,
Luca

Web: http://spazidigitali.com
Email: mailto://[email protected]
Skype: callto://l.mearelli

Antonio C. wrote:

if @requirement.save
flash[:notice] = 'Richiesta inviata con Id: #{@requirement.id}"
Se questo non funziona, e il record viene inserito nel tuo database, c’�
decisamente qualche problema.

ho reinstallato l’adapter firebirded ora questo codice funziona

if @requirement.save

flash[:notice] =  @requirement.id // Mi visualizza id

redirect_to :action => 'show'
else
  render :action => 'new'
end

end

questo continua a non funzionare ( errore nil)
def show
@requirement = Requirement.find(@requirement.id) // non funziona va
scritta cosi’?
end
def create

if @requirement.save
redirect_to :action => ‘show’
else
render :action => ‘new’
end
end
Ma per il momento mi basta questo.
Grazie a tutti per le risposte
Ciao

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

ho reinstallato l’adapter firebirded ora questo codice funziona

Ottimo.

questo continua a non funzionare ( errore nil)

end

end

E’ normale che non funziona. In pratica Biagio, l’oggetto @requirement
che
crei all’interno di un metodo del controller non e’ automaticamente
disponibile negli altri metodi.
Per cui devi passare il valore in qualche modo (Luca ti ha mostrato un
modo
che puoi usare da subito).

Piu’ in generale, anticipo la domanda, se la logica dell’applicazione
richiede di avere l’oggetto costantemente disponibile negli altri
metodi,
puoi sempre usare un filtro before_filter :set_my_variable (dove
set_my_variable e’ un metodo privato) nell’application controller. In
questo
modo l’oggetto e’ disponibile per gli altri metodi. Attenzione, non hai
bisogno di tutto questo nel tuo caso specifico.

Ciao,
Antonio

Antonio C. wrote:

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

ho reinstallato l’adapter firebirded ora questo codice funziona

Ottimo.

questo continua a non funzionare ( errore nil)

end

end

E’ normale che non funziona. In pratica Biagio, l’oggetto @requirement
che
crei all’interno di un metodo del controller non e’ automaticamente

Immaginavo che questo errore era dovuto a mia Ruby-ignoranza

Ti ringrazio nuovamente ( a te e agli altri)
Grazie ancora e a risentirci
BM

— Biagio M. [email protected] ha scritto:

Immaginavo che questo errore era dovuto a mia
Ruby-ignoranza

più che ruby è rails-ignoranza, una variabile
d’istanza è visibile agli altri metodi, solo che in
rails ogni volta che accedi ad un’azione viene creato
un nuovo oggetto e quindi le variabili d’istanza che
avevi settato prima non ci sono
più.


icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca

Il 9-08-2006 gabriele renzi ha scritto:

solo che in
rails ogni volta che accedi ad un’azione viene creato
un nuovo oggetto e quindi le variabili d’istanza che
avevi settato prima non ci sono più.

In effetti tenendo conto che spesso e volentieri due action significano
due query diverse e che Rails può girare anche con CGI direi che è
abbastanza naturale che sia così (anche se chiramente si sarebbe potuto
fare altrimenti).


blog: http://www.akropolix.net/rik0/blogs | Enrico F.
site: http://www.akropolix.net/rik0/ | RiK0
forum: http://www.akropolix.net/forum/ | Linux Counter: #299198