The code on
http://blog.craz8.com/articles/2005/10/28/acts_as_taggable-is-a-cool-piece-of-code
is based on the acts_as_taggable gem,anybody has done that using the
acts_as_taggable plugin?thanks!
btw:the code above uses the tag_count method,which is defined in the
gem:
def tags_count(options = {})
options = {:order => ''count DESC''}.merge(options)
o, t, o_pk, o_fk, t_pk, t_fk = table_name,
tag_model.table_name, primary_key, taggable_foreign_key,
tag_model.primary_key, tag_foreign_key
jt = tags_join_model ? tags_join_model.table_name :
tags_join_table
sql = "SELECT #{t}.#{t_pk} AS id, #{t}.name AS name, COUNT(*)
AS count FROM #{jt}, #{o}, #{t} WHERE #{jt}.#{t_fk} = #{t}.#{t_pk}
AND #{jt}.#{o_fk} = #{o}.#{o_pk}"
sql << " AND #{sanitize_sql(options[:conditions])}" if
options[:conditions]
sql << " GROUP BY #{t}.name"
sql << " HAVING count #{options[:count]} " if
options[:count]
sql << " ORDER BY #{options[:order]} " if
options[:order]
add_limit!(sql, options)
result = connection.select_all(sql)
count = result.inject({}) { |hsh, row|
hsh[row[''name'']] =
row[''count''].to_i; hsh } unless options[:raw]
count || result
end
and the note in
http://wiki.rubyonrails.org/rails/pages/ActsAsTaggablePluginHowto gives
an corresponding implementation for acts_as_taggable plugin :
def tags_count(options)
sql = "SELECT tags.id AS id, tags.name AS name, COUNT(*) AS count
FROM tags, taggings, #{table_name} "
sql << "WHERE taggings.taggable_id = #{table_name}.#{primary_key}
AND
taggings.tag_id = tags.id "
sql << "AND #{sanitize_sql(options[:conditions])} " if
options[:conditions]
sql << "GROUP BY tags.name "
sql << "HAVING count #{options[:count]} " if options[:count]
sql << "ORDER BY #{options[:order]} " if options[:order]
sql << "LIMIT #{options[:limit]} " if options[:limit]
find_by_sql(sql)
end
The latter tags_count method will not return a hash just as the former
do.
If i copy the corresponding code from the former method to the
latter,the tag clouds still can not work.
Anybody can help with the plugin?
--
Posted via http://www.ruby-forum.com/.
Here is the code that I use to create a tag_cloud.
#helper
def tag_cloud(tagged_items)
seperation = 2
min = tagged_items.values.min.to_f
max = tagged_items.values.max.to_f - min
mult = (seperation / max)
tagged_items.each do |tag, count, fsize|
yield tag, count, ((count - min) * mult) + 1
end
end
#view
<% tag_cloud(@tagged_items) do |tag, count, fsize| %>
<%= link_to(h(tag), {:action=> ''search'',
:phrase => tag},
{:style => "font-size: #{fsize}em"}) %>
<% end %>
#controller
def cloud
@tagged_items = Place.tags_count(:limit => 100)
end
If you have any questions just email. I lifted this code from a blog
sometime back.
John
On 4/3/06, Charlie <Charlie.cheung@usa.com> wrote:>
> The code on
>
>
http://blog.craz8.com/articles/2005/10/28/acts_as_taggable-is-a-cool-piece-of-code
> is based on the acts_as_taggable gem,anybody has done that using the
> acts_as_taggable plugin?thanks!
> btw:the code above uses the tag_count method,which is defined in the
> gem:
> def tags_count(options = {})
> options = {:order => ''count
DESC''}.merge(options)
>
> o, t, o_pk, o_fk, t_pk, t_fk = table_name,
> tag_model.table_name, primary_key, taggable_foreign_key,
> tag_model.primary_key, tag_foreign_key
> jt = tags_join_model ? tags_join_model.table_name :
> tags_join_table
>
> sql = "SELECT #{t}.#{t_pk} AS id, #{t}.name AS name,
COUNT(*)
> AS count FROM #{jt}, #{o}, #{t} WHERE #{jt}.#{t_fk} = #{t}.#{t_pk}
> AND #{jt}.#{o_fk} = #{o}.#{o_pk}"
> sql << " AND
#{sanitize_sql(options[:conditions])}" if
> options[:conditions]
> sql << " GROUP BY #{t}.name"
> sql << " HAVING count #{options[:count]} " if
options[:count]
> sql << " ORDER BY #{options[:order]} " if
options[:order]
> add_limit!(sql, options)
> result = connection.select_all(sql)
> count = result.inject({}) { |hsh, row|
hsh[row[''name'']] > row[''count''].to_i; hsh
} unless options[:raw]
>
> count || result
> end
>
> and the note in
> http://wiki.rubyonrails.org/rails/pages/ActsAsTaggablePluginHowto gives
> an corresponding implementation for acts_as_taggable plugin :
> def tags_count(options)
> sql = "SELECT tags.id AS id, tags.name AS name, COUNT(*) AS count
> FROM tags, taggings, #{table_name} "
> sql << "WHERE taggings.taggable_id =
#{table_name}.#{primary_key} AND
> taggings.tag_id = tags.id "
> sql << "AND #{sanitize_sql(options[:conditions])} " if
> options[:conditions]
> sql << "GROUP BY tags.name "
> sql << "HAVING count #{options[:count]} " if
options[:count]
> sql << "ORDER BY #{options[:order]} " if options[:order]
> sql << "LIMIT #{options[:limit]} " if options[:limit]
> find_by_sql(sql)
> end
>
> The latter tags_count method will not return a hash just as the former
> do.
> If i copy the corresponding code from the former method to the
> latter,the tag clouds still can not work.
> Anybody can help with the plugin?
>
> --
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Rails mailing list
> Rails@lists.rubyonrails.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>
--
John Hornbeck
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://wrath.rubyonrails.org/pipermail/rails/attachments/20060404/dade21b9/attachment-0001.html
very grateful,but I have got the following error: John Hornbeck wrote:> Here is the code that I use to create a tag_cloud. > > #helper > def tag_cloud(tagged_items) > > seperation = 2 > min = tagged_items.values.min.to_fundefined method `values''> max = tagged_items.values.max.to_f - min > mult = (seperation / max) > > tagged_items.each do |tag, count, fsize| > yield tag, count, ((count - min) * mult) + 1 > end > > end > > If you have any questions just email. I lifted this code from a blog > sometime back. > > John-- Posted via http://www.ruby-forum.com/.
I got it worked by modifying
http://blog.craz8.com/articles/2005/10/28/acts_as_taggable-is-a-cool-piece-of-code
first: the tags_count method in acts_as_taggable should be:
def tags_count(options)
sql = "SELECT tags.id AS id, tags.name AS name, COUNT(*) AS count
FROM tags, taggings, #{table_name} "
sql << "WHERE taggings.taggable_id = #{table_name}.#{primary_key}
AND
taggings.tag_id = tags.id "
sql << "AND #{sanitize_sql(options[:conditions])} " if
options[:conditions]
sql << "GROUP BY tags.name "
sql << "HAVING count #{options[:count]} " if options[:count]
sql << "ORDER BY #{options[:order]} " if options[:order]
sql << "LIMIT #{options[:limit]} " if options[:limit]
result = find_by_sql(sql)
count = result.inject({}) { |hsh, row| hsh[row[''name'']] =
row[''count''].to_i; hsh } unless options[:raw]
count || result
end
second:the helper:
def tag_cloud(tag_cloud, category_list)
max, min = 0, 0
tag_cloud.each do |tag, count|
max = count if count > max
min = count if count < min
end
divisor = ((max - min) / category_list.size) + 1
tag_cloud.each do |tag, count|
yield tag, category_list[(count - min) / divisor]
end
end
I am not so familiar with the Ruby language,but I think the original:
tag_cloud.each_value do |count|
max = count if count > max
min = count if count < min
end
will not work unless each_value method will be given.
Then it works.
--
Posted via http://www.ruby-forum.com/.
Glad you got it working. I am not using that plugin, so I guess it would need a little changing. John On 4/3/06, Charlie <Charlie.cheung@usa.com> wrote:> > I got it worked by modifying > > http://blog.craz8.com/articles/2005/10/28/acts_as_taggable-is-a-cool-piece-of-code > > first: the tags_count method in acts_as_taggable should be: > def tags_count(options) > sql = "SELECT tags.id AS id, tags.name AS name, COUNT(*) AS count > FROM tags, taggings, #{table_name} " > sql << "WHERE taggings.taggable_id = #{table_name}.#{primary_key} AND > taggings.tag_id = tags.id " > sql << "AND #{sanitize_sql(options[:conditions])} " if > options[:conditions] > sql << "GROUP BY tags.name " > sql << "HAVING count #{options[:count]} " if options[:count] > sql << "ORDER BY #{options[:order]} " if options[:order] > sql << "LIMIT #{options[:limit]} " if options[:limit] > result = find_by_sql(sql) > count = result.inject({}) { |hsh, row| hsh[row[''name'']] > row[''count''].to_i; hsh } unless options[:raw] > count || result > end > > second:the helper: > def tag_cloud(tag_cloud, category_list) > max, min = 0, 0 > tag_cloud.each do |tag, count| > max = count if count > max > min = count if count < min > end > > divisor = ((max - min) / category_list.size) + 1 > > tag_cloud.each do |tag, count| > yield tag, category_list[(count - min) / divisor] > end > end > I am not so familiar with the Ruby language,but I think the original: > tag_cloud.each_value do |count| > max = count if count > max > min = count if count < min > end > will not work unless each_value method will be given. > > > Then it works. > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- John Hornbeck -------------- next part -------------- An HTML attachment was scrubbed... URL: http://wrath.rubyonrails.org/pipermail/rails/attachments/20060404/6664e9cb/attachment-0001.html