Migliorare tagging


#1

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


#2

Ciao

Alcune osservazioni :smiley:

In primis immagino che tu abbia omesso nella mail ma creato
nell’applicazione tutti i
necessari has_and_belongs_to_many :smiley:

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. :smiley:

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


#3

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://github.com/mattetti/acts_as_taggable_on_steroids/tree/master


#4

Sandro P. wrote:

In primis immagino che tu abbia omesso nella mail ma creato
nell’applicazione tutti i
necessari has_and_belongs_to_many :smiley:

Sì, certo :wink:

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. :smiley:

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” :wink: ogni scusa è buona per creare tutto da me.


#5

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 :smiley:

Buone vacanze ! :smiley:

Sandro

2008/12/24 Marco C. removed_email_address@domain.invalid