Problematica variabili di istanza e database (neofita)

Buona serata

sono alle prese con i primi passi nel framework Ruby on Rails

il motivo della mia immersione in questo mondo è per la tesi di laurea…
dovrò sviluppare un’applicazione con questo framework… magari appena
entro nel dettaglio vi aggiornerò

avrei bisogno di due aiutini, premetto che ancora non conosco tutti i
meccanismi di Ruby on Rails e non conosco alla perfezione Ruby ma
essendo uno studente di ingegneria informatica bene o male seguendo
qualche guida e cominciando a vedere il libro Agile Development with
Rails qualche base già ce l’ho… ma mi sono bloccato…

mettiamo che io voglia utilzzare una classe User per gestire gli utenti
e Address per i relativi indirizzi, ovvio potrei inserire i campi
dell’indirizzo nell’utente ma faccio questo esempio per capire come
funziona rails

le cose che avrei bisogno di sapere sono:
come interagire tra dati di più database
come gestire i tipi non primitivi nel database (mi spiego meglio
dopo…)

se per esempio direttamente in SQL scrivessi qualcosa del tipo:

select users.nome, users.cognome, addresses.indirizzo,
addresses.citta from users join addresses on addresses.user_id =
users.id

come lo dovrei tradurre in ruby?

se utilizzo find_by_sql su User e Address ovviamente la cosa funziona ma
io lo vorrei fare diciamo solo su User e costruire l’indirizzo con la
foreign key…

mi spiego meglio… in java, per esempio avrei avuto la classe Address
con all’interno un campo user_id, e questo l’ho fatto anche in ruby, e
User con all’interno una variabile d’istanza di tipo Address da
“costruire”… in ruby come si fa? o meglio… essendo sia Address che
User già mappate sul db tramite Active Record… meglio che non dico
altro se no potrei confondere le idee…

per l’altro problema, che in SQL risolverei, senza considerare eventuali
problemi di driver che anche possono esserci, così (potrei usare gli
alias ma è x far capir meglio la cosa):

  select db1.users.nome, db1.users.cognome, db2.addresses.citta from

bd1.users join db2.addresses on db2.addresses.user_id = db1.users.id

come dovrei modificare il file database.yml? o devo specificare in ogni
modello qualcosa tipo:

ActiveRecord::Base.establish_connection bla bla…

se devo fare così il file database.yml lo devo lasciare?

scusate le tante domande ma ci sto uscendo un pò pazzo e visto che sto
esplorando per la prima volta il framework con l’azienda con la quale
faccio il tirocinio vi chiedo se possibile di darmi una mano

ho letto, ma ancora non studiato di direttive tipo :has_many,
:has_one… che potrebbero risolvere la mia situazione ma comunque
saranno implementate in qualche modo…

scusatemi per le pessime doti riassuntive e per il titolo forse non
molto adatto…

buona serata a tutti e grazie in anticipo
Silvio

beh forse avrei dovuto scrivere due topic differeti e magari scrivere
nel forum inglese, ma spero che qualcuno possa darmi una mano…

ancora grazie

2011/12/19 Silvio Dell’Oste [email protected]

beh forse avrei dovuto scrivere due topic differeti e magari scrivere
nel forum inglese, ma spero che qualcuno possa darmi una mano…

Ciao Silvio,

come sospettavi devi usare le associations. Ti rimando alla guida sul
sito
ufficiale di Ruby on Rails che spiega nel dettaglio le relazioni. Nel
tuo
caso potresti modellare con una 1…n

quindi qualcosa tipo:

class User < ActiveRecord::Base
has_many :addresses
end

class Address < ActiveRecord::Base
belongs_to :user
end

Affinch questa associazione funzioni dovrai avere un campo user_id sulla
tabella addresses. Il vantaggio di un ORM come activerecord quello che
nella maggior parte degli use case semplici, non devi metterti a
scrivere
le clausole di join manualmente.

Ciao
Stefano

Ciao Silvio,
sono neofita quasi quanto te, ma proprio ieri mi sono posta il problema
delle association e delle condizioni dei join. Come consigliato da
Stefano, ti rimando a questa pagina della documentazione di RoR online

che parla delle join in particolare. Comunque considera che usando il
concatenamento dei metodi, puoi costruire le query come meglio credi, in
particolare qui

indicato come puoi specificare delle condizioni per il join.
Esempio veloce, seguendo l’esempio di Stefano:

class User < ActiveRecord::Base
has_many :addresses
end

class Address < ActiveRecord::Base
belongs_to :user
end

User.joins(:address).where(address: {city: ‘Milano’})

e in questo modo ottieni tutti gli utenti che abitano a Milano.

Se devi fare un join semplice, solo sull’id, tramite le association
risolvi tutti i tuoi problemi, perch pensa a tutto rails (has_many,
has_one, belongs_to mettono in relazione fra loro i modelli, perci per
avere l’utente di un certo indirizzo di baster fare address.user e Rails
ti esporr poi i campi dell’utente, cio puoi recuperare nome e cognome
con address.user.name ad esempio.

Ciao!
molli

Stefano P. wrote in post #1037489:

Ciao Silvio,

come sospettavi devi usare le associations. Ti rimando alla guida sul
sito
ufficiale di Ruby on Rails che spiega nel dettaglio le relazioni. Nel
tuo
caso potresti modellare con una 1…n

quindi qualcosa tipo:

class User < ActiveRecord::Base
has_many :addresses
end

class Address < ActiveRecord::Base
belongs_to :user
end

Affinch questa associazione funzioni dovrai avere un campo user_id sulla
tabella addresses. Il vantaggio di un ORM come activerecord quello che
nella maggior parte degli use case semplici, non devi metterti a
scrivere
le clausole di join manualmente.

Ciao
Stefano

Grazie delle info… il prossimo passo per me sarà allora vedere come
funzionano le relazioni che a questo punto direi che sono qualcosa di
veramente potente… spero di comprenderle per bene dato che appunto
dovrò fare una tesi e non posso semplicemente usarle :slight_smile:

per il problema dei database distribuiti mica sai qualcosa?

grazie

Monica G. wrote in post #1037502:

Ciao Silvio,
sono neofita quasi quanto te, ma proprio ieri mi sono posta il problema
delle association e delle condizioni dei join. Come consigliato da
Stefano, ti rimando a questa pagina della documentazione di RoR online
Active Record Query Interface — Ruby on Rails Guides
che parla delle join in particolare. Comunque considera che usando il
concatenamento dei metodi, puoi costruire le query come meglio credi, in
particolare qui

indicato come puoi specificare delle condizioni per il join.
Esempio veloce, seguendo l’esempio di Stefano:

class User < ActiveRecord::Base
has_many :addresses
end

class Address < ActiveRecord::Base
belongs_to :user
end

User.joins(:address).where(address: {city: ‘Milano’})

e in questo modo ottieni tutti gli utenti che abitano a Milano.

Se devi fare un join semplice, solo sull’id, tramite le association
risolvi tutti i tuoi problemi, perch pensa a tutto rails (has_many,
has_one, belongs_to mettono in relazione fra loro i modelli, perci per
avere l’utente di un certo indirizzo di baster fare address.user e Rails
ti esporr poi i campi dell’utente, cio puoi recuperare nome e cognome
con address.user.name ad esempio.

Ciao!
molli

Ciao Monica… grazie delle informazioni, anche se in realtà
quell’istruzione che mi hai detto non funziona…

ecco l’errore: NoMethodError: undefined method `joins’ for …

non so se dipende dalla versione di rails che ho installato… da shell
risulta ruby 1.9.2p290 e rails 3.1.3 … ma non riesco a capire come
verificarlo in netbeans, dove trovo che posso lavorare sotto JRuby 1.6.5
e Built-in JRuby 1.5.1, io per ora sto usando questa, oltre che la
versione ruby 1.9.2p29… ma nessuna info su rails…

lavoro sotto windows, ma la cosa non credo dipenda da questo…

purtroppo ho netbeans 6.9.1 perchè da questo in poi non c’è il supporto
per RoR

vedo di risolvere… ma se avete dritte grazie :slight_smile:

non so se aprire un nuovo topic per il problema del db…

Ciao Monica… grazie delle informazioni, anche se in realt
quell’istruzione che mi hai detto non funziona…

Probabilmente un mio errore, il nome della tabella va al plurale
(addresses: )

Fammi sapere!

Anchio sono un neofita, personalmente ti consiglio di (almeno mentre
impari) non usare Netbeans, meglio usare un bell’editor non troppo
invasivo
che per ti permetta di avere meno problemi possibile.

Io sono un utilizzatore abituale di Netbeans come IDE, ma per quanto
riguarda Rails mi ha un p deluso, almeno per ora, visto che stanno per
far
uscire una nuova versione…

Il giorno 21 dicembre 2011 15:11, Silvio Dell’Oste
[email protected]ha scritto:

Monica G. wrote in post #1037583:

Ciao Monica… grazie delle informazioni, anche se in realt
quell’istruzione che mi hai detto non funziona…

Probabilmente un mio errore, il nome della tabella va al plurale
(addresses: )

Fammi sapere!

mmm… credo dipenda dalla versione di rails… che a me è 2.3.8 (quella
built-in j-ruby 1.5.1 di Netbeans) che non mi fa aggionare… anche se
accedo da amministratore mi aggiorna quasi tutte le gem tranne rails e
poche altre…

ho provato a far girare il progetto sotto jruby 1.6.5 che è esterno o
ruby 1.9.2p290 ma niente da fare…

ho netbeans 6.9.1 perchè l’ultimo che supporta ruby…

devo vedere se trovo il modo di far girare il progetto sotto jruby
esterno e per ora vedere con quella versione funzionante di rails come
posso fare le join… per ora uso il “metodo” find_by_sql ma non è certo
una soluzione accettabile…

Luca B. wrote in post #1037675:

Anchio sono un neofita, personalmente ti consiglio di (almeno mentre
impari) non usare Netbeans, meglio usare un bell’editor non troppo
invasivo
che per ti permetta di avere meno problemi possibile.

Io sono un utilizzatore abituale di Netbeans come IDE, ma per quanto
riguarda Rails mi ha un p deluso, almeno per ora, visto che stanno per
far
uscire una nuova versione…

Il giorno 21 dicembre 2011 15:11, Silvio Dell’Oste
[email protected]ha scritto:

grazie per il consiglio ma… dovendo fare la tesi… credo di dover
usare per forza un IDE…

Si, all’interno della where va indicata la tabella quindi in plurale:

User.joins(:address).where(:addresses => {:city => ‘Milano’})

Marco M. wrote in post #1037677:

Si, all’interno della where va indicata la tabella quindi in plurale:

User.joins(:address).where(:addresses => {:city => ‘Milano’})

infatti leggendo la documentazione ho capito che dovevo scrivere il nome
della tabella… che poi va beh equivale al nome scritto in piccolo e al
plurale del modello… il problema è che non mi funziona, credo per la
versione della gem rails che non riesco ad aggiornare :frowning:

Silvio Dell’Oste wrote in post #1037672:

mmm… credo dipenda dalla versione di rails… che a me è 2.3.8 (quella
built-in j-ruby 1.5.1 di Netbeans) che non mi fa aggionare… anche se
accedo da amministratore mi aggiorna quasi tutte le gem tranne rails e
poche altre…

ho provato a far girare il progetto sotto jruby 1.6.5 che è esterno o
ruby 1.9.2p290 ma niente da fare…

ho netbeans 6.9.1 perchè l’ultimo che supporta ruby…

devo vedere se trovo il modo di far girare il progetto sotto jruby
esterno e per ora vedere con quella versione funzionante di rails come
posso fare le join… per ora uso il “metodo” find_by_sql ma non è certo
una soluzione accettabile…

La versione di monica utilizza hash con sintassi 1.9, quella che ti ho
messo io va bene dalla 1.8. Utilizza anche arel e serve quindi rails 3.
La stessa cosa puoi eseguirla così e va bene pure sulle vecchie:

User.find(:all, :joins => [:address], :conditions => {:addresses =>
{:city => ‘Milano’}}

Questa va bene con qualsiasi versione e secondo me va molto meglio della
controparte arel.

Silvio Dell’Oste wrote in post #1037680:

Marco M. wrote in post #1037677:

Si, all’interno della where va indicata la tabella quindi in plurale:

User.joins(:address).where(:addresses => {:city => ‘Milano’})

infatti leggendo la documentazione ho capito che dovevo scrivere il nome
della tabella… che poi va beh equivale al nome scritto in piccolo e al
plurale del modello… il problema è che non mi funziona, credo per la
versione della gem rails che non riesco ad aggiornare :frowning:

Crea una nuova istanza con rails 3.1, non aggiornare un am.biente con
rails 2 che nascono molte incompatibilità, a meno che non ci siano
particolari motivi.
Riguardo l’ide, purtroppo devo sconsigliarti netbeans, io sono passato a
ruby mine ma va benissimo un comune editor, anzi, all’inizio è meglio
così utilizzi la console ed apprendi molti dettagli che altrimenti
rimarrebbero nascosti.

2011/12/21 Silvio Dell’Oste [email protected]

grazie per il consiglio ma… dovendo fare la tesi… credo di dover
usare per forza un IDE…

Prometto di non aprire una guerra di religione tra editor… (W VIM
:-)).
Per io questa consecutio non l’ho capita.

Secondo me devi scegliere un “ambiente lavorativo” che sia per te
ergonomico in modo da scrivere codice come dio comanda.
Indipendentemente
se lo fai per la tesi o per lavoro.

IMHO
Paolo


“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

2011/12/21 Paolo P. [email protected]:

se lo fai per la tesi o per lavoro.

IMHO
Paolo

+1

Paolo hai ragione…

forse son stato un pò troppo sintetico nella risposta, hai
perfettamente ragione, mi spiego meglio:

la scelta non è totalmente mia

l’idea in azienda (dove faccio il tirocinio) era quella di usare
netbeans se possibile perchè loro lo usano per fare quel che fanno o
magari eclipse, che da quanto ho capito leggendo un pò in giro può dare
dei problemi

netbeans qualche bel problema in fase di configurazione me l’ha dato,
specialmente sulla JDK di default che ho dovuto cambiare non proprio
facilmente… è un problema ricorrente da quanto ho letto ma almeno
quello l’ho risolto…

ora direi che il problema è riuscire a far capire a netbeans che ho una
versione più nuova delle gemme e che vorrei utilizzare non jruby interno
ma quello esterno…

Marco M. wrote in post #1037677:

Si, all’interno della where va indicata la tabella quindi in plurale:

User.joins(:address).where(:addresses => {:city => ‘Milano’})

ops… mi ero perso questo messaggio… grazie Marco… così funziona…
in pratica ho il problema della versione delle gemme…

in ogni caso ringrazio tutti per il supporto e l’aiuto che mi state
dando…

se riesco continuerò con Netbeans, se no, visto che ci tengono
abbastanza che usi un IDE (per poter scrivere nella tesi anche della
relativa configurazione) potrei provare IntelliJ che mi hanno
consigliato nell’altro topic o il famoso e consigliato un pò da tutti
RubyMine che però è a pagamento… e non so se mi permetterebbero di
usare dato che i progetti non dovrebbero restare solo a me ma anche al
prof e all’azienda…

potrei provare anche Vim ma se mi riesce vorrei continuare con Netbeans
o Eclipse (con Aptana Studio)… dovrebbe essere l’ultimo dei problemi
l’IDE e invece mi sto scervellando anche per questo :slight_smile:

grazie di tutto comunque… so che potrei scocciarvi ancora…

Luca B. wrote in post #1037703:

personalmente non scocci :smiley:

Il giorno 21 dicembre 2011 16:34, Silvio Dell’Oste
[email protected]ha scritto:

grazie Luca, sei utile e simpatico :slight_smile:

spero di uscire fuori da questa situazione presto dato che sono in
ritardo sullo sviluppo vero e proprio…

personalmente non scocci :smiley:

Il giorno 21 dicembre 2011 16:34, Silvio Dell’Oste
[email protected]ha scritto: