# Migliorare tagging

**URL:** <https://www.ruby-forum.com/t/migliorare-tagging/156271>\
**Category:** IT\
**Created:** [December 23, 2008, 7:01pm UTC](https://www.ruby-forum.com/t/migliorare-tagging/156271 "2008-12-23T19:01:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![collimarco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ecb155/32.png) [@collimarco](https://www.ruby-forum.com/u/collimarco)\
**Post date:** [December 23, 2008, 7:01pm UTC](https://www.ruby-forum.com/t/migliorare-tagging/156271/1 "2008-12-23T19:01:30Z")

</div>

Ciao,  
sono un neofita di rails ed ho appena realizzato un sistema di tagging  
per un blog. Vorrei sapere se il codice che ho scritto nel model del  
Post Ã¨ sufficientemente pulito o se Ã¨ meglio apportare qualche modifica.  
Inoltre, Ã¨ corretto utilizzare degli attributi virtuali in questo modo?

# CreateTags migration

create\_table :tags do |t|  
t.string :name  
end

add\_index :tags, :name, :unique =\> true

# CreatePostsTags migration

create\_table :posts\_tags, :id =\> false do |t|  
t.references :post  
t.references :tag  
end

# Post model

def tag\_string  
self.tags.collect { |t| t.name }.join(", ")  
end

def tag\_string=(t)  
self.tags.clear  
t.split(/,\s\*/).uniq.collect { |t| self.tags \<\<  
Tag.find\_or\_initialize\_by\_name(t) }  
end

Grazie mille

---

<div class="post-metadata">

**Author:** ![collimarco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ecb155/32.png) [@collimarco](https://www.ruby-forum.com/u/collimarco)\
**Post date:** [December 23, 2008, 9:53pm UTC](https://www.ruby-forum.com/t/migliorare-tagging/156271/2 "2008-12-23T21:53:16Z")

</div>

Ciao

Alcune osservazioni 😃

In primis immagino che tu abbia omesso nella mail ma creato  
nell’applicazione tutti i  
necessari has\_and\_belongs\_to\_many 😃

Poi… allora…per quanto riguarda le migrations nulla da dire, ne per la  
funzione  
tag\_string che mi sembra tuttosommato ok (anche se tieni presente che  
poi  
magari  
vorrai aggiungere un link ad ognuno di quei tag per cui forse sarebbe  
più  
opportuno  
fare una funzione che accetti un blocco che ne specifichi la  
formattazione,  
tipo:

def tag\_string(&block)  
tags.collect( |t| block.call(t)}.join(",")  
end

in modo poi da poter fare nella view:

\<%= @post\_selezionato.tag\_string{|t| link\_to t.name,  
{:controller=\>‘posts’,  
:action=\>‘tag’, :id=\>t.id} } %\>

)

Per quanto riguarda invece la funzione tag\_string= io la  
rifattorizzaerei  
cosi:

def tag\_string=(t)  
tags += t.split(",").uniq.collect{|e|  
Tag.find\_or\_initialize\_by\_name(e)}  
end

Attenzione però che in questo modo non consideriamo eventuali doppioni già  
presenti in tags,  
per ovviare potremmo fare:

def tag\_string=(t)  
(tags += t.split(",").uniq.collect{|e|  
Tag.find\_or\_initialize\_by\_name(e)}).uniq!  
end

Spero di esserti stato d’aiuto. 😃

ps: immagino che questa richiesta abbia un sottofondo più accademico che  
funzionale,  
se così non fosse sappi che nella rete ci sono ottimi plugin già fatti per  
gestire questo  
genere di features (vado a memoria, acts\_as\_taggable\_redux, anche se non  
sono certo si  
chiami  
così)  
Sandro

---

<div class="post-metadata">

**Author:** ![collimarco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ecb155/32.png) [@collimarco](https://www.ruby-forum.com/u/collimarco)\
**Post date:** [December 23, 2008, 10:28pm UTC](https://www.ruby-forum.com/t/migliorare-tagging/156271/3 "2008-12-23T22:28:26Z")

</div>

Sandro P. wrote:

> ps: immagino che questa richiesta abbia un sottofondo più accademico che  
> funzionale,  
> se così non fosse sappi che nella rete ci sono ottimi plugin già fatti per  
> gestire questo  
> genere di features (vado a memoria, acts\_as\_taggable\_redux, anche se non  
> sono certo si  
> chiami così)  
> [http://agilewebdevelopment.com/plugins/acts\_as\_taggable\_on\_steroids](http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids)  
> [GitHub - mattetti/acts\_as\_taggable\_on\_steroids: (OBSOLETE) This plugin is based on acts\_as\_taggable by DHH but includes extras](http://github.com/mattetti/acts_as_taggable_on_steroids/tree/master)

---

<div class="post-metadata">

**Author:** ![collimarco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ecb155/32.png) [@collimarco](https://www.ruby-forum.com/u/collimarco)\
**Post date:** [December 24, 2008, 11:57am UTC](https://www.ruby-forum.com/t/migliorare-tagging/156271/4 "2008-12-24T11:57:32Z")

</div>

Sandro P. wrote:

> In primis immagino che tu abbia omesso nella mail ma creato  
> nell’applicazione tutti i  
> necessari has\_and\_belongs\_to\_many 😃

SÃ¬, certo 😉

> Poi… allora…per quanto riguarda le migrations nulla da dire, ne per la  
> funzione  
> tag\_string che mi sembra tuttosommato ok (anche se tieni presente che  
> poi  
> magari  
> vorrai aggiungere un link ad ognuno di quei tag per cui forse sarebbe  
> piï¿½  
> opportuno  
> fare una funzione che accetti un blocco che ne specifichi la  
> formattazione,  
> tipo:
> 
> def tag\_string(&block)  
> tags.collect( |t| block.call(t)}.join(",")  
> end
> 
> in modo poi da poter fare nella view:
> 
> \<%= @post\_selezionato.tag\_string{|t| link\_to t.name,  
> {:controller=\>‘posts’,  
> :action=\>‘tag’, :id=\>t.id} } %\>
> 
> )

A dire il vero nella domanda mi ero dimenticato di dire che ho anche  
creato il seguente helper:

def tag\_links(tags)  
tags.map { |t| link\_to h(t.name), t }.join(", ")  
end

che poi invoco cosÃ¬:

tag\_links @post.tags

E’ meglio incorporare il tutto nella funzione tag\_string come hai  
mostrato sopra ?

> Per quanto riguarda invece la funzione tag\_string= io la  
> rifattorizzaerei  
> cosi:
> 
> def tag\_string=(t)  
> tags += t.split(",").uniq.collect{|e|  
> Tag.find\_or\_initialize\_by\_name(e)}  
> end
> 
> Attenzione perï¿½ che in questo modo non consideriamo eventuali doppioni giï¿½  
> presenti in tags,  
> per ovviare potremmo fare:
> 
> def tag\_string=(t)  
> (tags += t.split(",").uniq.collect{|e|  
> Tag.find\_or\_initialize\_by\_name(e)}).uniq!  
> end
> 
> Spero di esserti stato d’aiuto. 😃

Certamente! Grazie ancora

> ps: immagino che questa richiesta abbia un sottofondo piï¿½ accademico che  
> funzionale,  
> se cosï¿½ non fosse sappi che nella rete ci sono ottimi plugin giï¿½ fatti per  
> gestire questo  
> genere di features (vado a memoria, acts\_as\_taggable\_redux, anche se non  
> sono certo si  
> chiami  
> cosï¿½)

SÃ¬ ne sono a conoscenza, ma visto che il mio scopo ha “un sottofondo piï¿½  
accademico” 😉 ogni scusa Ã¨ buona per creare tutto da me.

---

<div class="post-metadata">

**Author:** ![collimarco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ecb155/32.png) [@collimarco](https://www.ruby-forum.com/u/collimarco)\
**Post date:** [December 24, 2008, 10:41pm UTC](https://www.ruby-forum.com/t/migliorare-tagging/156271/5 "2008-12-24T22:41:17Z")

</div>

Ciao

Per la domanda sui tag… non sÃ², in realtÃ stÃ un pÃ² a come hai  
strutturato  
il tutto  
e a come preferisci muoverti tu 😃

Buone vacanze ! 😃

Sandro

2008/12/24 Marco C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
