Organizzare i modelli

Devo mettere su un sistema per registrare delle consegne.
Modello Utente;
A tale utente vengono consegnati dei pacchi e deve essere registrata
la data di consegna piu’ alcune note.
Inizialmente pensavo di fare un m-m tra Utente e Consegna, cioe’ un
utente puo’ ricevere diverse consegne e ad una certa data di consegna
possono risultare piu’ utenti.
Il fatto pero’ che devo registrare anche delle note fa si che questo
elemento sia specifico per ogni utente.
A questo punto dovrebbe essere 1-m tra Utente e Consegna e m-m tra
Utente e DataConsegna.
Dovrei cioe’ aggiungere un altro modello: DataConsegna.
Corretto?

Il 12 marzo 2010 12.31, Mauro [email protected] ha scritto:

Utente e DataConsegna.
Dovrei cioe’ aggiungere un altro modello: DataConsegna.
Corretto?
Non capisco, perché ti serve un modello per DataConsegna?
Un utente riceve molte Consegne, una Consegna ha delle note (come
attributi o altro) e un campo data_consegna; in un certo giorno sono
avvenute molte consegne, trovabili con Consegna.nella_data(x). Non è
sufficiente questo?
O hai annotazioni da riferire a tutte le consegne di ieri?

pietro

2010/3/12 Pietro G. [email protected]:

A questo punto dovrebbe essere 1-m tra Utente e Consegna e m-m tra
Utente e DataConsegna.
Dovrei cioe’ aggiungere un altro modello: DataConsegna.
Corretto?
Non capisco, perché ti serve un modello per DataConsegna?
Un utente riceve molte Consegne, una Consegna ha delle note (come
attributi o altro) e un campo data_consegna; in un certo giorno sono
avvenute molte consegne, trovabili con Consegna.nella_data(x). Non è
sufficiente questo?
O hai annotazioni da riferire a tutte le consegne di ieri?

La note e’ specifica per l’utente.
Utente X si presenta gli viene consegnato il pacco e viene registrata
la consegna in data … aggiungendo una nota.
Quindi si, non avendo il campo nota potrei usare solo Utente e
Consegna, per un certo Utente posso risalire a tutte le consegne fatte
e per una certa data di consegna posso risalire a tutti gli utenti che
hanno avuto una consegna in quella data.
Pero’ c’e’ di mezzo la nota che ripeto e’ specifica per l’utente.

Scusa, ma neanche io capisco il fatto delle note:

  • l’utente X consegna un pacco
  • eventualmente aggiune una nota
  • viene registrata una data di ricezione

quindi i campi del modello Consegna potrebbero essere:

  • data_consegna
  • id_utente
  • nota

questo tenendo prensente che una consegna è collegata ad un solo utente
per volta. altrimenti ti occorre un altro modello Nota con almeno
l’id_utente ed eventualmente id_consegna.

ma è un servizio di spedizioni? perchè tra “consegna” e “ricezione” non
è molto chiaro il meccanismo che vuoi far funzionare :stuck_out_tongue:

ciao,
A.

2010/3/12 Andrea P. [email protected]:

questo tenendo prensente che una consegna è collegata ad un solo utente
per volta. altrimenti ti occorre un altro modello Nota con almeno
l’id_utente ed eventualmente id_consegna.

ma è un servizio di spedizioni? perchè tra “consegna” e “ricezione” non
è molto chiaro il meccanismo che vuoi far funzionare :stuck_out_tongue:

Cerco di essere piu’ chiaro, scusa.
Allora:
esiste uno sportello consegne al quale si presenta l’Utente X.
L’operatore allo sportello carica i dati relativi all’utente, nome,
cognome, ecc. gli consegna qualcosa e registra la data di consegna con
in aggiunta un’eventuale nota.
Si presenta l’utente Y lo stesso giorno, idem come sopra, viene
registrata la data di consegna che sara’ uguale a quella registrata
per l’utente X ma con una nota diversa, specifica per l’utente Y.
Dopo un anno si ripresentano gli utenti X e Y, stesso procedimento.
Non so se ora si capisce.

Ok, quindi il problema è molto più semplice, riprendo il codice di
Pietro, tanto per non riscrivere :stuck_out_tongue:

class User
has_many :deliveries
end

class Delivery
belongs_to :user
end

la tabella “deliveries”, ovviamente, dovrà prevedere un campo ‘nota’. In
questo modo:

1- arriva l’utente X
2- riceve un “pacco”, vengono registrate (o richiamate, in caso esista)
le sue generalità, la data di consegna ed un’eventuale nota da allegare
3- arriva l’utente Y
4- si ripete il passo 2

ciao,
A.

Il 12 marzo 2010 13.23, Mauro [email protected] ha scritto:

La note e’ specifica per l’utente.
Utente X si presenta gli viene consegnato il pacco e viene registrata
la consegna in data … aggiungendo una nota.
Quindi si, non avendo il campo nota potrei usare solo Utente e
Consegna, per un certo Utente posso risalire a tutte le consegne fatte
e per una certa data di consegna posso risalire a tutti gli utenti che
hanno avuto una consegna in quella data.
Pero’ c’e’ di mezzo la nota che ripeto e’ specifica per l’utente.

Quindi una cosa tipo questa?

class User
has_many :deliveries
has_many :notes, :through => :notes
end

class Delivery
belongs_to :user
has_many :notes
end

class Note
belongs_to :delivery
has_many :users, :through => delivery
end

pietro

Il 12 marzo 2010 22.08, Mauro [email protected] ha scritto:

end

la tabella “deliveries”, ovviamente, dovrà prevedere un campo ‘nota’. In questo modo:

1- arriva l’utente X
2- riceve un “pacco”, vengono registrate (o richiamate, in caso esista) le sue generalità, la data di consegna ed un’eventuale nota da allegare
3- arriva l’utente Y
4- si ripete il passo 2

Manca un elemento: e se volessi sapere quante consegne e a chi sono
state fatte in una certa data?

Delivery.find(:all , :conditions => [‘delivered_at > ? AND
delivered_at < ?’, mezzanotte_prima, mezzanotte_dopo])

pietro

2010/3/12 Andrea P. [email protected]:

la tabella “deliveries”, ovviamente, dovrà prevedere un campo ‘nota’. In questo modo:

1- arriva l’utente X
2- riceve un “pacco”, vengono registrate (o richiamate, in caso esista) le sue generalità, la data di consegna ed un’eventuale nota da allegare
3- arriva l’utente Y
4- si ripete il passo 2

Manca un elemento: e se volessi sapere quante consegne e a chi sono
state fatte in una certa data?

Il 12 marzo 2010 22.36, Pietro G. [email protected] ha
scritto:

Manca un elemento: e se volessi sapere quante consegne e a chi sono
state fatte in una certa data?

Delivery.find(:all , :conditions => [‘delivered_at > ? AND
delivered_at < ?’, mezzanotte_prima, mezzanotte_dopo])

named_scope :delivered_at_date, lambda {|time| :conditions =>
[‘delivered_at > ? AND delivered_at < ?’, time.beginning_of_day,
time.end_of_day]}

Delivery.delivered_at_date 3.months.ago

p.s. se a un certo punto ti accorgi che stai facendo troppe query
troppo diversificate, tanto da non poterne uscire con due o tre
named_scope, potrebbe avere senso creare un modello Date, o un modello
DateRange, ma si tratterebbe di modelli tableless, cioè non associati
a una certa tabella.

In pratica crei una classe a cui delegare i calcoli dei periodi; qui:

http://asciicasts.com/episodes/193-tableless-model (versione testo)
#193 Tableless Model - RailsCasts (versione con video)
trovi un esempio, non legato alle date, ma da cui puoi trarre spunto.

Ma, ripeto, ha senso solo se non te la puoi cavare con un paio di named
scope.

pietro