Forum: Italian Ruby user group Creare un index composto da due tabelle

Posted by fdibe nedetto (fdibenedetto72)
on 2010-08-12 19:56
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| %>
  <tr>
    <td><%=h utenti.id %></td>
    <td><%=h utenti.cognome_note %></td>
    <td><%=h utenti.idtipo %></td>
    <td><%=h utenti.tipoutentis.descrizione %></td>
  </tr>
<% end %>
</table>

<br />

provato va in errore ma dov'e l'errore ???
mi potete aiutare ?? grazie mille
Posted by Alessandro Scolavino (ninjinka)
on 2010-08-13 09:29
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
Posted by fdibe nedetto (fdibenedetto72)
on 2010-08-13 12:31
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 Scolavino 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
Posted by Andrea Pavoni (apeacox)
on 2010-08-13 13:57
(Received via mailing list)
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:

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

terzo ed ultimo consiglio: se vuoi aiuto, incolla almeno l'errore che
hai ricevuto ;)

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 ;-)

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:
Posted by fdibe nedetto (fdibenedetto72)
on 2010-08-13 15:24
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 Pavoni 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:
> 
> http://guides.rubyonrails.org/index.html
> 
> terzo ed ultimo consiglio: se vuoi aiuto, incolla almeno l'errore che
> hai ricevuto ;)
> 
> 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 ;-)
> 
> 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:
Posted by fdibe nedetto (fdibenedetto72)
on 2010-08-13 15:49
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| %>
  <tr>
    <td><%=h utenti.id %></td>
    <td><%=h utenti.cognome_note %></td>
    <td><%=h utenti.tipoutenti_id %></td>
    <td><%=h utenti.tipoutenti.descrizione %></td>
......


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 Pavoni 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:
>> 
>> http://guides.rubyonrails.org/index.html
>> 
>> terzo ed ultimo consiglio: se vuoi aiuto, incolla almeno l'errore che
>> hai ricevuto ;)
>> 
>> 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 ;-)
>> 
>> 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:
Posted by Andrea Pavoni (apeacox)
on 2010-08-13 15:51
(Received via mailing list)
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 ;-)

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 ;)

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 :P

ciao,
A.


Il 13/08/2010 15:24, Fabio Di benedetto ha scritto:
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.