Creare un index composto da due tabelle

Salve a tutti dovrei creare nella pagina index un semplice elenco
composto da dati provenienti da due tabelle
esempio :
Tabella Utentis Tabella Tipoutentis
id,nome,cognome,idtipo id,descrizione

nel model utenti ho inserito

class Utenti < ActiveRecord::Base
has_and_belongs_to_many :tipoutentis
end

nel model Tipoutenti ho inserito

class Tipoutenti < ActiveRecord::Base
has_and_belongs_to_many :utentis
end

nel controller utentis
def index
@utentis = Utenti.find(:all, :include=> :tipoutentis)

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @utentis }
end

end

nela view index ho inserito il seguente codice
<% @utentis.each do |utenti| %>

<%=h utenti.id %> <%=h utenti.cognome_note %> <%=h utenti.idtipo %> <%=h utenti.tipoutentis.descrizione %> <% end %>

provato va in errore ma dov’e l’errore ???
mi potete aiutare ?? grazie mille

Sarebbe meglio leggersi almeno le API…

  1. has_and_belongs_to_many non è il tipo adatto per questa relazione, è
    una relazione di tipo n a n non 1 a n come risulta essere la tua.

  2. gli standard di rails prevedono che la colonna di collegamento fra i
    due models sia strutturata così [nome_tabella]_id la tua esce dallo
    standard quindi devi specificarla a mano

Non ti scrivo come devi fare il codice, altrimenti sei punto a capo la
prossima volta (cone le due osservazioni dovresti trovare la soluzione
facilmente sulle api di active_record)

Fabio Di benedetto wrote:

provato va in errore ma dov’e l’errore ???
mi potete aiutare ?? grazie mille

Ciao Alessandro,
ho cambiato nella tabella utentis l’id di collegamento mettendo
tipoutentis_id nei model rispettivamente ho inserito

class Utenti < ActiveRecord::Base
has_many :tipoutentis
end

nel model Tipoutenti ho inserito

class Tipoutenti < ActiveRecord::Base
belongs_to :utentis
end

quindi nell index di utentis
ho inserito
@utentis = Utenti.find(:all, :include=> :tipoutentis)

ma il risultato non cambia mi dice sempre ?
mi potresti postare la soluzione francamente con un esempio funzinante e
la guida ci posso capire meglio!
Saluti fdibenedetto

le due clausole belong_to
Alessandro S. wrote:

Sarebbe meglio leggersi almeno le API…

  1. has_and_belongs_to_many non è il tipo adatto per questa relazione, è
    una relazione di tipo n a n non 1 a n come risulta essere la tua.

  2. gli standard di rails prevedono che la colonna di collegamento fra i
    due models sia strutturata così [nome_tabella]_id la tua esce dallo
    standard quindi devi specificarla a mano

Non ti scrivo come devi fare il codice, altrimenti sei punto a capo la
prossima volta (cone le due osservazioni dovresti trovare la soluzione
facilmente sulle api di active_record)

Fabio Di benedetto wrote:

provato va in errore ma dov’e l’errore ???
mi potete aiutare ?? grazie mille

ciao Fabio,

un consiglio per evitare di incasinarti la vita, soprattutto se sei alle
prime armi, è quello di seguire le convenzioni usate da rails (come già
accennato da Alessandro). nel tuo caso, comincia ad usare nomi di
tabelle in inglese, perchè vengono gestite meglio (già con termini
plurali e singolari ad esempio).

la seconda cosa, è di leggere un po’ di documentazione. probabilmente
troverai molto utili le guide che trovi qui:

terzo ed ultimo consiglio: se vuoi aiuto, incolla almeno l’errore che
hai ricevuto :wink:

venendo al tuo problema, a occhio, hai sbagliato almeno la dichiarazione
in Tipoutenti:

belongs_to :utenti

perchè è singolare, cioè un Tipoutente appartiene a un Utente. sempre a
occhio, credo che la relazione sia al contrario: un utente appartiene ad
un tipo_utente, mentre un tipoutente può avere più utenti :wink:

hai anche sbagliato la dichiarazione delle classi. il nome di un model è
al singolare, cioè Utente e Tipoutente, la tabella invece è al plurale
perchè contiene più record di un certo tipo. rails incoraggia un
approccio discorsivo, in pseudo-codice o a voce, diresti:

  • un Tipoutente ha_molti Utenti
  • un Utente appartiene_a un Tipoutente
  • seleziona un Utente con id 1 dalla tabella ‘utenti’
  • etc…

ciao,
A.

Il 13/08/2010 12:31, Fabio Di benedetto ha scritto:

Ciao Andrea,
vediamo se ho capito

class Tipoutenti < ActiveRecord::Base
has_many :utentis
end

class Utenti < ActiveRecord::Base
belongs_to :tipoutenti
end

class UtentisController < ApplicationController

GET /utentis

GET /utentis.xml

def index
@utentis = Utenti.all(:include => :tipoutenti)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @utentis }
end
end

l’errore che mi configura e’
undefined method `tipoutentis_id’ for #<Utenti id: 6, cognome_note:
“fabio”, tipoutenti_id: 1>

grazie sempre per la tua pazienza !!!

Andrea P. wrote:

ciao Fabio,

un consiglio per evitare di incasinarti la vita, soprattutto se sei alle
prime armi, � quello di seguire le convenzioni usate da rails (come gi�
accennato da Alessandro). nel tuo caso, comincia ad usare nomi di
tabelle in inglese, perch� vengono gestite meglio (gi� con termini
plurali e singolari ad esempio).

la seconda cosa, � di leggere un po’ di documentazione. probabilmente
troverai molto utili le guide che trovi qui:

Ruby on Rails Guides

terzo ed ultimo consiglio: se vuoi aiuto, incolla almeno l’errore che
hai ricevuto :wink:

venendo al tuo problema, a occhio, hai sbagliato almeno la dichiarazione
in Tipoutenti:

belongs_to :utenti

perch� � singolare, cio� un Tipoutente appartiene a un Utente. sempre a
occhio, credo che la relazione sia al contrario: un utente appartiene ad
un tipo_utente, mentre un tipoutente pu� avere pi� utenti :wink:

hai anche sbagliato la dichiarazione delle classi. il nome di un model �
al singolare, cio� Utente e Tipoutente, la tabella invece � al plurale
perch� contiene pi� record di un certo tipo. rails incoraggia un
approccio discorsivo, in pseudo-codice o a voce, diresti:

  • un Tipoutente ha_molti Utenti
  • un Utente appartiene_a un Tipoutente
  • seleziona un Utente con id 1 dalla tabella ‘utenti’
  • etc…

ciao,
A.

Il 13/08/2010 12:31, Fabio Di benedetto ha scritto:

Risolto il problema i questo modo

class Tipoutenti < ActiveRecord::Base
has_many :utentis
end

class Tipoutenti < ActiveRecord::Base
has_many :utentis
end

class UtentisController < ApplicationController

GET /utentis

GET /utentis.xml

def index
@utentis = Utenti.find(:all ,:include => :tipoutenti)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @utentis }
end
end

<% @utentis.each do |utenti| %>

<%=h utenti.id %> <%=h utenti.cognome_note %> <%=h utenti.tipoutenti_id %> <%=h utenti.tipoutenti.descrizione %> ......

Grazei ragazzi per i suggerimenti dopo 20 anni di onorato vb6 ed asp
inizio a cimentarmi in RAILS tra libri e aiuti validi spero di riuscire
a essere indipendente quanto prima e di poter poter contare sempre di
Voi.

Saluti e buon ferragosto!
fdibenedetto

Fabio Di benedetto wrote:

Ciao Andrea,
vediamo se ho capito

class Tipoutenti < ActiveRecord::Base
has_many :utentis
end

class Utenti < ActiveRecord::Base
belongs_to :tipoutenti
end

class UtentisController < ApplicationController

GET /utentis

GET /utentis.xml

def index
@utentis = Utenti.all(:include => :tipoutenti)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @utentis }
end
end

l’errore che mi configura e’
undefined method `tipoutentis_id’ for #<Utenti id: 6, cognome_note:
“fabio”, tipoutenti_id: 1>

grazie sempre per la tua pazienza !!!

Andrea P. wrote:

ciao Fabio,

un consiglio per evitare di incasinarti la vita, soprattutto se sei alle
prime armi, � quello di seguire le convenzioni usate da rails (come gi�
accennato da Alessandro). nel tuo caso, comincia ad usare nomi di
tabelle in inglese, perch� vengono gestite meglio (gi� con termini
plurali e singolari ad esempio).

la seconda cosa, � di leggere un po’ di documentazione. probabilmente
troverai molto utili le guide che trovi qui:

Ruby on Rails Guides

terzo ed ultimo consiglio: se vuoi aiuto, incolla almeno l’errore che
hai ricevuto :wink:

venendo al tuo problema, a occhio, hai sbagliato almeno la dichiarazione
in Tipoutenti:

belongs_to :utenti

perch� � singolare, cio� un Tipoutente appartiene a un Utente. sempre a
occhio, credo che la relazione sia al contrario: un utente appartiene ad
un tipo_utente, mentre un tipoutente pu� avere pi� utenti :wink:

hai anche sbagliato la dichiarazione delle classi. il nome di un model �
al singolare, cio� Utente e Tipoutente, la tabella invece � al plurale
perch� contiene pi� record di un certo tipo. rails incoraggia un
approccio discorsivo, in pseudo-codice o a voce, diresti:

  • un Tipoutente ha_molti Utenti
  • un Utente appartiene_a un Tipoutente
  • seleziona un Utente con id 1 dalla tabella ‘utenti’
  • etc…

ciao,
A.

Il 13/08/2010 12:31, Fabio Di benedetto ha scritto:

ciao di nuovo Fabio,

l’errore che hai ricevuto è riferito al fatto che nel db non hai un
campo chiamato ‘tipoutentis_id’, ma ne hai uno ‘tipoutenti_id’. ti
ricordo inoltre che i nomi che stai usando potrebbero facilmente
portarti a errori tuoi (perchè ti confondi) o di rails che potrebbe
interpretare male i plurali/singolari, oltre al fatto che leggendo il
codice, a livello cognitivo stonerebbe parecchio :wink:

l’ideale, sarebbe ri-scrivere i modelli (e le migrazioni) in questo
modo:

definisco una classe che rappresenta il modello Utente

class User < ActiveRecord::Base
belongs_to :usertype
end

definisco una classe che rappresenta il modello Tipoutente

class Usertype < ActiveRecord::Base
has_many :users
end

nel controller il codice non cambierebbe di molto:

def index
# seleziono tutti gli User nel database ed assegno il risultato alla
variabile @utenti
@utenti = User.all(:include => :usertypes)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @utenti }
end
end

nessuno ti vieta di usare l’italiano nel codice (anche se l’inglese
sarebbe meglio), tuttavia cerca di rispettare almeno le semplici
convenzioni/regole di rails :wink:

comunque, tieni sempre presente che sviluppare un’applicazione web con
ruby e rails, fondamentalmente non è diverso dall’usare un qualsiasi
altro linguaggio o framework: semplicemente ti agevola nello svolgere i
task (portando numerosi vantaggi pratici, ammesso che segui alcune
regole, è pur sempre un framework!), ma non significa che permette di
scrivere applicazioni web senza possedere le conoscenze necessarie a
farlo, per esempio, con PHP o ASP.NET :stuck_out_tongue:

ciao,
A.

Il 13/08/2010 15:24, Fabio Di benedetto ha scritto: