Confusione sulle associazioni

Ho i modelli Ruser e Bag.
Uso Ruser al posto di User perche’ “user” crea problemi con postgres.
I bags (sacchetti) devono essere consegnati a Ruser e mi serve sapere
la data di consegna.
Ho creato queste associazioni:

class Ruser < ActiveRecord::Base
has_many :deliveries
has_many :bags, :through => :deliveries

class Bag < ActiveRecord::Base
has_many :deliveries
has_many :rusers, :through => :deliveries

class Delivery < ActiveRecord::Base
belongs_to :ruser
belongs_to :bag

Ruser and Bag sono gia’ popolati.
Delivery ha delivered_at come attributo extra.

Devo consegnare 3 bags (sacchetti) a un Ruser.
Posso fare
bags=Bags.all
user=Ruser.find(params[:id])
delivery = user.deliveries.create(:delivered_at => Date.today).
Pero’ non posso fare delivery.bags << bags.
Cosi’ come sono fatte le associazioni dovrei creare tante deliveries
quanti sono i sacchetti consegnati ma se consegno piu di un sacchetto
in uno stesso giorno mi piacerebbe poter fare qualcosa tipo
delivery.bags << bags.
Probabilmente c’e’ qualche errore nelle associazioni.

mmh e che ne pensi di questo?

user.bags << bags
user.deliveries.where(:delivered_at => nil).update_all(:delivered_at
=> Date.today)

In pratica te inserisci gli oggetti bags, questo fa si che vengano
generati degli oggetti deliveries “vuoti”, ovvero con “delivered_at”
impostato a nil.
Infine usi quest’ultima informazione per aggiornare gli attributi
necessari.

L’ho testato su rails 3.0.3/ruby 1.9.2.

A proposito, che ne dici di questa notazione?

user.deliveries.where(delivered_at: nil).update_all(delivered_at:
Date.today)

E’ un po’ piu’ concisa su ruby 1.9 :wink:

Maurizio

Il 24 gennaio 2011 14:03, Mauro [email protected] ha scritto:

2011/1/24 maurizio de magnis [email protected]:

L’ho testato su rails 3.0.3/ruby 1.9.2.

A proposito, che ne dici di questa notazione?

user.deliveries.where(delivered_at: nil).update_all(delivered_at: Date.today)

E’ un po’ piu’ concisa su ruby 1.9 :wink:

E’ una soluzione, dovrebbe funzionare anche su ruby 1.8, io uso jruby.

2011/1/24 Mauro [email protected]:

Infine usi quest’ultima informazione per aggiornare gli attributi necessari.

L’ho testato su rails 3.0.3/ruby 1.9.2.

A proposito, che ne dici di questa notazione?

user.deliveries.where(delivered_at: nil).update_all(delivered_at: Date.today)

E’ un po’ piu’ concisa su ruby 1.9 :wink:

E’ una soluzione, dovrebbe funzionare anche su ruby 1.8, io uso jruby.

No, l’ultima notazione non funziona con ruby 1.8.

Il 24 gennaio 2011 17:11, Mauro [email protected] ha scritto:

2011/1/24 Mauro [email protected]:

2011/1/24 maurizio de magnis [email protected]:
[cut]

user.deliveries.where(:delivered_at => nil).update_all(:delivered_at
=> Date.today)
[cut]
user.deliveries.where(delivered_at: nil).update_all(delivered_at: Date.today)

E’ perche’ in ruby 1.9 puoi passare i parametri secondo la notazione

key: value

al posto di

:key => value

Maurizio

Il 24/01/2011 17:00, Mauro ha scritto:

A proposito, che ne dici di questa notazione?

user.deliveries.where(delivered_at: nil).update_all(delivered_at: Date.today)

E’ un po’ piu’ concisa su ruby 1.9 :wink:

si, purtroppo funziona solo sulla 1.9 :stuck_out_tongue:


http://twitter.com/apeacox

On 24 January 2011 17:16, maurizio de magnis
[email protected] wrote:

key: value

al posto di

:key => value

Allora come ho detto aspetto che jruby supporti pienamente ruby 1.9
per usare la nuova notazione :-).
Tra parentesi tornando a bomba la seguente notazione user.bags << bags
salva automaticamente l’oggetto? Non ho bisogno di fare user.save?

2011/1/24 Andrea P. [email protected]:

Il 24/01/2011 17:00, Mauro ha scritto:

A proposito, che ne dici di questa notazione?

user.deliveries.where(delivered_at: nil).update_all(delivered_at: Date.today)

E’ un po’ piu’ concisa su ruby 1.9 :wink:

si, purtroppo funziona solo sulla 1.9 :stuck_out_tongue:

Beh purtroppo…non e’ che ci sia tutta questa differenza, comunque
allora aspetto che jruby supporti ruby 1.9, la prossima versione 1.6
dovrebbe farlo.

E comunque sarei interessato a sapere se c’e’ qualche soluzione
one-shot predisposta per questi casi, in modo da ottenere, per
esempio, il chain degli oggetti generati. Qualcosa tipo:

bags = bag.all
result = User.find(id).bags.push(bags)
result.related_deliveries.update_all(…)

Maurizio

Il 24 gennaio 2011 17:27, maurizio de magnis
[email protected] ha scritto:

Puoi evitare di chiamare la save, nei log dovresti vedere tutte le
insert effettuate nella tabella “deliveries” :slight_smile:

Maurizio

Il 24 gennaio 2011 17:25, Mauro [email protected] ha scritto:

2011/1/24 maurizio de magnis [email protected]:

E comunque sarei interessato a sapere se c’e’ qualche soluzione
one-shot predisposta per questi casi,

Pure io :slight_smile: