Associazioni tra tabelle e query sql

Salve a tutti. Sono di nuovo qui con un quesito niubbo.
Ho un db con 3 tabelle collegate in questo modo

TABELLA1 (soluzioni)
id
attr
tabella2_id
tabella3_id

TABELLA2 (corsi)
id
attr

TABELLA3 (pd)
id
attr

Ho specificato le associazioni tra le varie tabelle nei file dei modelli
(
tabella1.rb, tabella2.rb…)in questo modo

class Tabella1 < ActiveRecord::Base
belongs_to :Tabella2
belongs_to :Tabella3
end

class Tabella2 < ActiveRecord::Base
has_many :Tabella1
end

class Tabella3 < ActiveRecord::Base
has_many :Tabella1
end

Poi ho definito nel controller

def visualizza
@tab = Tabella1.find(params[:tabella3_id]) #dovrebbe
restituire la lista dei record di tabella1 che hanno
tabella3_id=parametropassato
end

Quello che voglio fare ora è visualizzare nella vista “visualizza.rhtml”
una
tabella con queste colonne

tabella1.attr tabella2.attr

dove le righe visualizzate vengono filtrate in base a un determinato
valore
di tabella3.id.
In sostanza in sql la query sarebbe:

SELECT tabella1.attr, tabella2.attr
FROM tabella1, tabella2,tabella3
WHERE tabella1.tabella2_id = tabella2.id
AND tabella1.tabella3_id = tabella3.id
AND
tabella3.id=$valore_passato_per_parametro_al_momento_dellinvocazione_della_action

La domanda è: come faccio a “puntare” agli attributi delle 2 tabelle
collegate con la tabella1? Devo farlo direttamente dalla vista oppure lo
devo fare dal controller?
E ancora, è corretta la definizione della action “visualizza”?

Mi scuso per la lunghezza della mail.

indizio: come fai a far capire a Tabella1.find che l’id che gli stai
passando non è di tabella1 ma di tabella3?

jek

indizio piu attinente: non pensare alle query, ragiona ad oggetti, luke!

:slight_smile: jek

poiché tabella3_id è collegato a tabella3 automaticamente, mediante foreign
key?
o forse non ho capito cosa intendi…

Ho provato a fare
così.Ho definito nel controller:

def visualizza
@tab = Tabella1.find(params[‘tabella3_id’])
end

Quando chiamo la action ‘visualizza’ utilizzo:

<%= link_to ‘link’, :action=>‘visualizza’, :id => tabella3.id %>

Mentre visualizza.rhtml è così composta:

<% for tabella1 in @tab %>

<% end %>

Il risultato è un’eccezione: Couldn’t find Tabella1 without an ID.

Non capisco proprio dov’è l’errore…

def visualizza
@tab = Tabella1.find(params[‘tabella3_id’])
end

il problema sta qua

il metodo find viene tradotto in questo modo
"SELECT * FROM tabella1 WHERE id = "+params[:tabella_id]

che non credo sia quello che hai bisogno di fare

prova con

@tab = Tabella1.find(:all, :conditions => [“tabella3_id = ?”,
params[:tabella3_id]])

Il 29/06/07, Lucea [email protected] ha scritto:

<%= link_to ‘link’, :action=>‘visualizza’, :id => tabella3.id %>

indizio: come fai a far capire a Tabella1.find che l’id che gli stai

id
(

tabella3_id=parametropassato
dove le righe visualizzate vengono filtrate in base a un determinato



Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

Grazie a tutti per l’aiuto! Sono riuscita a farlo funzionare!
Ho definito

@tab = Tabella1.find(:all, :conditions => [“tabella3_id = ?”,
params[:id]])

E per passare il parametro alla action ho usato:

<%= link_to ‘visualizza’, :action=>‘visualizza’, :id => tabella3.id %>

Avevo provato anche con
@tab = Tabella1.find(:all, :conditions => [“tabella3_id = ?”,
params[:tabella3_id]])

<%= link_to ‘visualizza’, :action=>‘visualizza’, :tabella3_id =>
tabella3.id%>

Ma questo non funziona (o meglio, il parametro passato risulta NULL)!
Qualcuno sa dirmi
perché?Grazie ancora a tutti!

volendo nella vista puoi evitare il “.id” scrivendo
<%= link_to ‘visualizza’, :action=>‘visualizza’, :id => tabella3 %>

ci pensa rails a tirare fuori l’id dal modello

Il 29/06/07, Lucea [email protected] ha scritto:

end
@tab = Tabella1.find(:all, :conditions => [“tabella3_id = ?”,

<% end %>

o forse non ho capito cosa intendi…

-----Original Message-----
attr
attr
end

una
SELECT tabella1.attr, tabella2.attr

Ml mailing list


vega 4 - burn and fade away


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

Intendevo questo con il pensare ad oggetti:

@tab = Tabella3.find(params[:id]).tabella1s

(dove tabella1s è il plurale del model Tabella1)

Dal momento che Tabella3 has many tabella1s (e non Tabella1 come hai
scritto), ti basta creare un’istanza di Tabella3 (quella relativa all’id
che ti passi dal form), questa istanza avrà automaticamente il metodo
tabella1s che ti restituisce un’array di istanze di Tabella1, ovvero
quelle collegate alla tua tabella3

Quando si usa un linguaggio totalmente orientato agli oggetti, come
Ruby, con una persistenza dei dati ad oggetti, come ActiveRecord,
pensare a come si facevano le cose nel mondo legacy non semplifica il
lavoro… Anzi complica parecchio le cose…

Quindi… Libri alla mano! Si ricomincia tutto da capo! :slight_smile: Io ci ho
messo un po a capire questa cosa, e per mesi ho usato una versione
“amputata” di rails, ovvero quella derivante dalla cultura di un
buzzurro (io) che per 10 anni ha lavorato in asp e php. Ci ho messo un
po, e sono ripartito dallo studio della programmazione ad oggetti (con
un corso affiancato da questo meraviglioso libro
(http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612)

  • disponibile anche in italiano.

A quel punto io ho iniziato a capire Rails, di cui ora coumnque uso una
bassa percentuale delle potenzialità (un po come il mio cervello :slight_smile: )

Ciao!, jeko

Alle venerdì 29 giugno 2007, Lucea ha scritto:

Avevo provato anche con
@tab = Tabella1.find(:all, :conditions => [“tabella3_id = ?”,
params[:tabella3_id]])

<%= link_to ‘visualizza’, :action=>‘visualizza’, :tabella3_id =>
tabella3.id%>

Ma questo non funziona (o meglio, il parametro passato risulta NULL)!
Qualcuno sa dirmi perché?

Quando passi un parametro con una GET o POST in questo modo
http://dominio/controller/action/123

Il parametro 123 e viene memorizzato in una variabile che per
convenzione si
chiama params[:id]

Affinche’ funzioni
@tab = Tabella1.find(:all, :conditions => [“tabella3_id = ?”,
params[:tabella3_id]])

nella url bisognerebbe scrivere:
http://dominio/controller/action/?tabella3_id=123

Ciao

Ti ringrazio molto per i consigli, purtroppo il mio problema è che non ho
tempo adesso per mettermi a studiare tutto da 0. Ho letto completamente
le
prime 200 pagine di Agile web dev with RoR, ma non ho trovato la
soluzione a
questo problema e non ho proprio tempo per leggermi tutto il malloppone!
Grazie mille per l’attenzione
Silvia