Forum: Italian Ruby user group Migliorare tagging

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Marco C. (Guest)
on 2008-12-23 20:01
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
Sandro P. (Guest)
on 2008-12-23 22:53
(Received via mailing list)
Ciao

Alcune osservazioni :D

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

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


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
Luca G. (Guest)
on 2008-12-23 23:28
(Received via mailing list)
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_tag...
http://github.com/mattetti/acts_as_taggable_on_ste...
Marco C. (Guest)
on 2008-12-24 12:57
Sandro P. wrote:
> In primis immagino che tu abbia omesso nella mail ma creato
> nell'applicazione tutti i
> necessari has_and_belongs_to_many :D

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


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.
Sandro P. (Guest)
on 2008-12-24 23:41
(Received via mailing list)
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 :D

Buone vacanze ! :D

Sandro

2008/12/24 Marco C. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.