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
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
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.
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. [email protected]