# Qualche domanda su alcune "best practices"

**URL:** <https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037>\
**Category:** IT\
**Created:** [February 13, 2008, 6:33pm UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037 "2008-02-13T18:33:32Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [February 13, 2008, 6:33pm UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037/1 "2008-02-13T18:33:32Z")

</div>

Ciao a tutti,

riprovo a postare le domande nella speranza che qualcuno sia in grado di  
fornirmi qualche indicazione… (temo infatti che la mia email  
precedente non sia stata vista da nessuno…).

Avrei alcune domande da porre a chi è un po’ più avanti di me nella  
progettazione di applicazioni RoR relative alla risoluzione “DRY” di  
alcuni problemi:

1. Nella applicazione che sto progettando mi sono trovato ad avere  
parecchie tabelle (quasi tutte a dire la verità) che hanno al loro interno  
il campo is\_active boolean per la determinazione della visibilità del  
record.  
Ora mi è balenata l’idea che si potrebbe spostare questa colonna su una  
tabella a parte creando una interfaccia (active) in cui implementare  
belongs\_to :activable e poi scrivere in tale oggetto una serie di metodi  
per cercare tutti gli oggetti attivati o meno (magari con with\_scope  
plugin) (nelle classi che la utilizzano pensavo di gestire un  
has\_one :active, :as =\> :activable), penso che così facendo da un lato se  
un domani avessi un ulteriore flag da gestire andrei a toccare solo una  
tabella ma dall’altro canto gestendo così la cosa, la ricerca sulla  
tabella non sarà ottimizzata come fare una ricerca per il campo messo  
nella direttamente nelle tabelle… Secondo voi è follia o una buona idea  
?

2. E’ possibile (o consigliabile) scrivere una serie di applicazioni  
facendo in modo che ognuna gestisca solo le “resources” REST pertinenti  
a tale applicazione ?  
Es. applicazione che gestisce solo le news e applicazione che gestisce  
solo i clienti poi il legame tra news e cliente viene gestito da una  
relazione REST inter applicazione…  
Anche qui secondo voi è una follia o è fattibile ?

Grazie in anticipo e buona giornata a tutti !

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [February 13, 2008, 7:21pm UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037/2 "2008-02-13T19:21:24Z")

</div>

> un domani avessi un ulteriore flag da gestire andrei a toccare solo una  
> tabella ma dall’altro canto gestendo così la cosa, la ricerca sulla tabella  
> non sarà ottimizzata come fare una ricerca per il campo messo nella  
> direttamente nelle tabelle… Secondo voi è follia o una buona idea ?

Ci sono già alcuni plugin che potresti usare. Dai un’occhiata a

[http://agilewebdevelopment.com/plugins/has\_states](http://agilewebdevelopment.com/plugins/has_states)  
[http://agilewebdevelopment.com/plugins/acts\_as\_state\_machine](http://agilewebdevelopment.com/plugins/acts_as_state_machine)  
[http://agilewebdevelopment.com/plugins/has\_flags](http://agilewebdevelopment.com/plugins/has_flags)

Per il discorso REST tra applicazioni, non credo di aver capito bene.  
Puoi  
spiegare meglio perchè dovrebbero essere applicazioni diverse? In ogni  
caso  
senza rest puoi dare uno sguardo a questo:

[http://rails-engines.org/](http://rails-engines.org/)

Mai provato però potrebbe esserti utile.

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [February 14, 2008, 9:02am UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037/3 "2008-02-14T09:02:52Z")

</div>

giovanni lion ha scritto:

> > un domani avessi un ulteriore flag da gestire andrei a toccare solo una  
> > [http://agilewebdevelopment.com/plugins/acts\_as\_state\_machine](http://agilewebdevelopment.com/plugins/acts_as_state_machine)  
> > [http://agilewebdevelopment.com/plugins/has\_flags](http://agilewebdevelopment.com/plugins/has_flags)

Grazie Giovanni, non conoscevo questi plugin, credo che has\_states sia  
quello + vicino alle mie esigenze (anche se ho visto che si deve portare  
dietro una tonnellata di altri plugin, ma lo provo senza’altro…).

> Per il discorso REST tra applicazioni, non credo di aver capito bene. Puoi  
> spiegare meglio perchè dovrebbero essere applicazioni diverse? In ogni caso  
> senza rest puoi dare uno sguardo a questo:
> 
> [http://rails-engines.org/](http://rails-engines.org/)
> 
> Mai provato però potrebbe esserti utile.

rails engines lo sto già usando su alcune applicazioni rails 1.2.x e ora  
lo dovrò usare anche sulla nuova app rails 2.x (ho visto che è stato  
rilasciato una versione apposita per 2) però la mia richiesta è un po’  
diversa, in poche parole vorrei distribuire la mia applicazione su più  
applicazioni (applicazione distribuita), ognuna delle quali si concentri  
su una particolare problematica.

Mi spiego meglio, ammettiamo di avere una applicazione che gestisca  
delle news/newsletter da esporre agli utenti di vari siti in area  
pubblica e questi dati si possano anche amministrare in area riservata  
mi troverei a gestire:

- Amministrazione news/newsletter
- Amministrazione clienti (1 cliente per ogni dominio)
- Amministrazione utenti/ruoli per ogni cliente/dominio
- Amministrazione security per dare accesso all’amministrazione di  
news/newsletter ai relativi ruoli utente

Ora se faccio tutto in un unica applicazione questa diventa monolitica,  
estremamente legata, sarebbe veramente una figata se si potesse creare:

- Applicazione di gestione news/newsletter (che gestisce solo le risorse  
(intendo proprio resources rest) news/newsletter/categorie/tipi ecc. sul  
db delle newsletter)
- Applicazione di gestione clienti (che gestisce solo le risorse  
clienti/categorie/tipi ecc. sul db dei clienti)
- Applicazione di gestione sicurezza (che gestisce solo le risorse  
utenti/ruoli/moduli applicativi con permessi-scadenze ecc. sul db dei  
sicurezza)

Questo tipo di applicazioni in linea del tutto teorica sarebbe anche  
fattibile crearle guardandole da un punto di vista di REST, quando poi  
la risorsa news ha collegato un id cliente (customer\_id) potrei mappare  
con il client rest la risorsa che mi espone l’applicazione dei clienti  
così da formare una suite di applicazioni che lavorano scambiandosi  
risorse; mi rendo conto però che così facendo a livello di model puro  
(non rest) perderei completamente la possibilità di fare cose carine  
tipo belongs\_to :customer oppure fare un News.find(:all, :include =\>  
:customer) per poter fare ricerche in cui la condizione la metto nella  
tabella in join…; oltretutto mi rendo anche conto che così facendo  
andrei incontro anche ad un problema non da poco: le transazioni  
distribuite, urca non ci avevo pensato, si potrebbe risolvere il  
problema lavorando con un solo db, ma allora se lavoro su un solo db  
perchè non fare un’unica applicazione ?

Ho come l’impressione che questo tipo di visione da un lato sia  
teoricamente possibile, dall’altro sia di difficile implementazione per  
le ragioni sopra esposte…

Chiedevo quindi se qualcuno si è mai cimentato in uno sviluppo di questo  
tipo…

> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Gianluca T.  
TreNetMediaMaster S.r.l.  
The Internet Technology Company  
Telefono +39(049)776196  
Fax +39(049)8087806  
Visit us @: [http://www.trenet.it](http://www.trenet.it) - [http://www.mediamaster.it](http://www.mediamaster.it)  
e-mail me @: removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [February 14, 2008, 11:14am UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037/4 "2008-02-14T11:14:41Z")

</div>

Gianluca T. wrote:

> … in poche parole vorrei distribuire la mia applicazione su piï¿½  
> applicazioni (applicazione distribuita), ognuna delle quali si concentri  
> su una particolare problematica.
> 
> Mi spiego meglio, ammettiamo di avere una applicazione che gestisca  
> delle news/newsletter da esporre agli utenti di vari siti in area  
> pubblica e questi dati si possano anche amministrare in area riservata  
> mi troverei a gestire:
> 
> - Amministrazione news/newsletter
> - Amministrazione clienti (1 cliente per ogni dominio)
> - Amministrazione utenti/ruoli per ogni cliente/dominio
> - Amministrazione security per dare accesso all’amministrazione di  
> news/newsletter ai relativi ruoli utente
> 
> Ora se faccio tutto in un unica applicazione questa diventa monolitica,  
> estremamente legata, sarebbe veramente una figata se si potesse creare:
> 
> - Applicazione di gestione news/newsletter (che gestisce solo le risorse  
> (intendo proprio resources rest) news/newsletter/categorie/tipi ecc. sul  
> db delle newsletter)
> - Applicazione di gestione clienti (che gestisce solo le risorse  
> clienti/categorie/tipi ecc. sul db dei clienti)
> - Applicazione di gestione sicurezza (che gestisce solo le risorse  
> utenti/ruoli/moduli applicativi con permessi-scadenze ecc. sul db dei  
> sicurezza)
> 
> Questo tipo di applicazioni in linea del tutto teorica sarebbe anche  
> fattibile crearle guardandole da un punto di vista di REST, quando poi  
> la risorsa news ha collegato un id cliente (customer\_id) potrei mappare  
> con il client rest la risorsa che mi espone l’applicazione dei clienti  
> cosï¿½ da formare una suite di applicazioni che lavorano scambiandosi  
> risorse; mi rendo conto perï¿½ che cosï¿½ facendo a livello di model puro  
> (non rest) perderei completamente la possibilitï¿½ di fare cose carine  
> tipo belongs\_to :customer oppure fare un News.find(:all, :include =\>  
> :customer) per poter fare ricerche in cui la condizione la metto nella  
> tabella in join…; oltretutto mi rendo anche conto che cosï¿½ facendo  
> andrei incontro anche ad un problema non da poco: le transazioni  
> distribuite, urca non ci avevo pensato, si potrebbe risolvere il  
> problema lavorando con un solo db, ma allora se lavoro su un solo db  
> perchï¿½ non fare un’unica applicazione ?
> 
> Ho come l’impressione che questo tipo di visione da un lato sia  
> teoricamente possibile, dall’altro sia di difficile implementazione per  
> le ragioni sopra esposte…
> 
> Chiedevo quindi se qualcuno si Ã¨ mai cimentato in uno sviluppo di questo  
> tipo…

Avere un controllo completo sul dominio del problema e’ fondamentale per  
estrarne il meglio.  
Partizionare il dominio comporta penalizzazioni alle prestazioni e alla  
flessibilitÃ .

Considera per esempio la tua idea di separare la gestione sicurezza in  
un’altra applicazione.  
La sicurezza e’ una funzionalita’ trasversale all’applicazione.

Praticamente ogni azione, prima di essere eseguita, richiede un  
controllo di autorizzazione.  
Non solo.  
Spesso anche oggetti di view dipendono dalla sicurezza: pensa alle voci  
di menu che vorresti visibili solo all’amministratore, per fare un  
esempio.  
Puoi permetterti di accedere via web al gestore di sicurezza una o piu’  
volte ad ogni azione?

Talora invece ci possono essere altre esigenze e REST ci permette  
qualcosa altrimenti molto piu’ difficile.

Ti accenno ad una mia esperienza.  
La nostra applicazione doveva gestire contatti, e piuttosto che  
implementare ex-novo la gestione contatti, abbiamo preferito utilizzare  
le API REST di Highrise ([http://www.highrisehq.com](http://www.highrisehq.com)).  
I tempi di sviluppo si sono ridotti notevolmente, ma abbiamo sacrificato  
una buona fetta di prestazioni, sia perchÃ¨ devi andare sulla rete a  
prendere dati, sia perchÃ¨ rinunci a tutte le ottimizzazioni che il  
database permette per reccogliere dati relazionati.

Se hai una porzione della tua applicazione che vedi come una componente  
verticale “isolabile” (low coupling, high cohesion) puoi considerare  
l’approccio external-REST, ma solo se ti porta grandi benefici.

Se hai controllo sul codice, l’approccio migliore e’ sicuramente quello  
dei plugin.  
Anche se forse Rails non ha una gestione di componenti all’altezza di  
Django (Python) o Seaside (Smalltalk), si possono ottenere elevati  
livelli di riusabilita’.

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [February 14, 2008, 11:42am UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037/5 "2008-02-14T11:42:54Z")

</div>

Claudio Petasecca D. ha scritto:

> > pubblica e questi dati si possano anche amministrare in area riservata
> > 
> > fattibile crearle guardandole da un punto di vista di REST, quando poi  
> > problema lavorando con un solo db, ma allora se lavoro su un solo db  
> > Avere un controllo completo sul dominio del problema e’ fondamentale per  
> > Non solo.  
> > La nostra applicazione doveva gestire contatti, e piuttosto che
> 
> Se hai controllo sul codice, l’approccio migliore e’ sicuramente quello  
> dei plugin.  
> Anche se forse Rails non ha una gestione di componenti all’altezza di  
> Django (Python) o Seaside (Smalltalk), si possono ottenere elevati  
> livelli di riusabilita’.

Ciao Claudio, ti ringrazio moltissimo dell’intervento, in effetti, piÃ¹  
ragiono sulla problematica e piÃ¹ mi accorgo che probabilmente Ã¨ meglio  
che vada tranquillo creando una applicazione completa di tutte le sue  
parti (che espongo anche come risorse cosÃ¬ le riutilizzo in seguito su  
altri progetti); magari seguo la strada dei plugin cosÃ¬ almeno cerco di  
sviluppare il + DRY possibile…

Grazie ancora !

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [February 14, 2008, 11:02am UTC](https://www.ruby-forum.com/t/qualche-domanda-su-alcune-best-practices/129037/6 "2008-02-14T11:02:16Z")

</div>

> > > cercare tutti gli oggetti attivati o meno (magari con with\_scope
> 
> dietro una tonnellata di altri plugin, ma lo provo senza’altro…).  
> Prego 🙂

> > 
> 
> (intendo proprio resources rest) news/newsletter/categorie/tipi ecc. sul  
> con il client rest la risorsa che mi espone l’applicazione dei clienti  
> così da formare una suite di applicazioni che lavorano scambiandosi  
> risorse; mi rendo conto però che così facendo a livello di model puro  
> (non rest) perderei completamente la possibilità di fare cose carine  
> tipo belongs\_to :customer oppure fare un News.find(:all, :include =\>  
> :customer) per poter fare ricerche in cui la condizione la metto nella  
> tabella in join…; oltretutto mi rendo anche conto che così facendo  
> andrei incontro anche ad un problema non da poco: le transazioni  
> distribuite, urca non ci avevo pensato, si potrebbe risolvere il  
> problema lavorando con un solo db, ma allora se lavoro su un solo db  
> perchè non fare un’unica applicazione ?

Forse questo può esserti utile se decidi di intraprendere questa strada:

[http://jamesgolick.com/resource\_controller/rdoc/index.html](http://jamesgolick.com/resource_controller/rdoc/index.html)

Ho come l’impressione che questo tipo di visione da un lato sia

> teoricamente possibile, dall’altro sia di difficile implementazione per  
> le ragioni sopra esposte…
> 
> Chiedevo quindi se qualcuno si è mai cimentato in uno sviluppo di questo  
> tipo…

Personalmente non ancora, ma credo che la via dell’ActiveResource sia  
promettente.  
Sorry, ma ora il lavoro mi chiamaaaaaaaa…
