acts-as-taggable-on 1.0.13 → 1.0.14
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +9 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/generators/acts_as_taggable_on_migration/acts_as_taggable_on_migration_generator.rb +7 -0
- data/generators/acts_as_taggable_on_migration/templates/migration.rb +29 -0
- data/lib/acts_as_taggable_on/acts_as_taggable_on.rb +5 -8
- data/lib/acts_as_taggable_on/tag.rb +1 -0
- data/lib/acts_as_taggable_on/tags_helper.rb +2 -0
- data/spec/acts_as_taggable_on/tag_spec.rb +11 -0
- metadata +4 -2
data/README.rdoc
CHANGED
@@ -151,6 +151,12 @@ A helper is included to assist with generating tag clouds.
|
|
151
151
|
|
152
152
|
Here is an example that generates a tag cloud.
|
153
153
|
|
154
|
+
Helper:
|
155
|
+
|
156
|
+
module PostsHelper
|
157
|
+
include TagsHelper
|
158
|
+
end
|
159
|
+
|
154
160
|
Controller:
|
155
161
|
|
156
162
|
class PostController < ApplicationController
|
@@ -160,7 +166,8 @@ Controller:
|
|
160
166
|
end
|
161
167
|
|
162
168
|
View:
|
163
|
-
|
169
|
+
|
170
|
+
<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
|
164
171
|
<%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
|
165
172
|
<% end %>
|
166
173
|
|
@@ -187,5 +194,6 @@ CSS:
|
|
187
194
|
* slainer68 - STI fix
|
188
195
|
* harrylove - migration instructions and fix-ups
|
189
196
|
* lawrencepit - cached tag work
|
197
|
+
* sobrinho - fixed tag_cloud helper
|
190
198
|
|
191
199
|
Copyright (c) 2007-2009 Michael Bleigh (http://mbleigh.com/) and Intridea Inc. (http://intridea.com/), released under the MIT license
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ begin
|
|
9
9
|
gemspec.email = "michael@intridea.com"
|
10
10
|
gemspec.homepage = "http://github.com/mbleigh/acts-as-taggable-on"
|
11
11
|
gemspec.authors = ["Michael Bleigh"]
|
12
|
-
gemspec.files = FileList["[A-Z]*", "{lib,spec,rails}/**/*"] - FileList["**/*.log"]
|
12
|
+
gemspec.files = FileList["[A-Z]*", "{generators,lib,spec,rails}/**/*"] - FileList["**/*.log"]
|
13
13
|
end
|
14
14
|
Jeweler::GemcutterTasks.new
|
15
15
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.14
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class ActsAsTaggableOnMigration < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :tags do |t|
|
4
|
+
t.column :name, :string
|
5
|
+
end
|
6
|
+
|
7
|
+
create_table :taggings do |t|
|
8
|
+
t.column :tag_id, :integer
|
9
|
+
t.column :taggable_id, :integer
|
10
|
+
t.column :tagger_id, :integer
|
11
|
+
t.column :tagger_type, :string
|
12
|
+
|
13
|
+
# You should make sure that the column created is
|
14
|
+
# long enough to store the required class names.
|
15
|
+
t.column :taggable_type, :string
|
16
|
+
t.column :context, :string
|
17
|
+
|
18
|
+
t.column :created_at, :datetime
|
19
|
+
end
|
20
|
+
|
21
|
+
add_index :taggings, :tag_id
|
22
|
+
add_index :taggings, [:taggable_id, :taggable_type, :context]
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.down
|
26
|
+
drop_table :taggings
|
27
|
+
drop_table :tags
|
28
|
+
end
|
29
|
+
end
|
@@ -154,24 +154,21 @@ module ActiveRecord
|
|
154
154
|
conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{Tagging.table_name}.taggable_id FROM #{Tagging.table_name} JOIN #{Tag.table_name} ON #{Tagging.table_name}.tag_id = #{Tag.table_name}.id AND (#{tags_conditions}) WHERE #{Tagging.table_name}.taggable_type = #{quote_value(base_class.name)})"
|
155
155
|
|
156
156
|
else
|
157
|
+
tags = Tag.named_like_any(tags)
|
158
|
+
|
157
159
|
tags.each do |tag|
|
158
|
-
safe_tag = tag.gsub(/[^a-zA-Z0-9]/, '')
|
160
|
+
safe_tag = tag.name.gsub(/[^a-zA-Z0-9]/, '')
|
159
161
|
prefix = "#{safe_tag}_#{rand(1024)}"
|
160
162
|
|
161
163
|
taggings_alias = "#{table_name}_taggings_#{prefix}"
|
162
|
-
tags_alias = "#{table_name}_tags_#{prefix}"
|
163
164
|
|
164
165
|
tagging_join = "JOIN #{Tagging.table_name} #{taggings_alias}" +
|
165
166
|
" ON #{taggings_alias}.taggable_id = #{table_name}.#{primary_key}" +
|
166
|
-
" AND #{taggings_alias}.taggable_type = #{quote_value(base_class.name)}"
|
167
|
+
" AND #{taggings_alias}.taggable_type = #{quote_value(base_class.name)}" +
|
168
|
+
" AND #{taggings_alias}.tag_id = #{tag.id}"
|
167
169
|
tagging_join << " AND " + sanitize_sql(["#{taggings_alias}.context = ?", context.to_s]) if context
|
168
170
|
|
169
|
-
tag_join = "JOIN #{Tag.table_name} #{tags_alias}" +
|
170
|
-
" ON #{tags_alias}.id = #{taggings_alias}.tag_id" +
|
171
|
-
" AND " + sanitize_sql(["#{tags_alias}.name like ?", tag])
|
172
|
-
|
173
171
|
joins << tagging_join
|
174
|
-
joins << tag_join
|
175
172
|
end
|
176
173
|
end
|
177
174
|
|
@@ -6,6 +6,7 @@ class Tag < ActiveRecord::Base
|
|
6
6
|
|
7
7
|
named_scope :named, lambda { |name| { :conditions => ["name = ?", name] } }
|
8
8
|
named_scope :named_like, lambda { |name| { :conditions => ["name LIKE ?", "%#{name}%"] } }
|
9
|
+
named_scope :named_like_any, lambda { |list| { :conditions => list.map { |tag| sanitize_sql(["name LIKE ?", tag.to_s]) }.join(" OR ") } }
|
9
10
|
|
10
11
|
# LIKE is used for cross-database case-insensitivity
|
11
12
|
def self.find_or_create_with_like_by_name(name)
|
@@ -7,6 +7,17 @@ describe Tag do
|
|
7
7
|
Tag.delete_all
|
8
8
|
end
|
9
9
|
|
10
|
+
describe "named like any" do
|
11
|
+
before(:each) do
|
12
|
+
Tag.create(:name => "awesome")
|
13
|
+
Tag.create(:name => "epic")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should find both tags" do
|
17
|
+
Tag.named_like_any(["awesome", "epic"]).should have(2).items
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
describe "find or create by name" do
|
11
22
|
before(:each) do
|
12
23
|
@tag.name = "awesome"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts-as-taggable-on
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Bleigh
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-17 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -27,6 +27,8 @@ files:
|
|
27
27
|
- README.rdoc
|
28
28
|
- Rakefile
|
29
29
|
- VERSION
|
30
|
+
- generators/acts_as_taggable_on_migration/acts_as_taggable_on_migration_generator.rb
|
31
|
+
- generators/acts_as_taggable_on_migration/templates/migration.rb
|
30
32
|
- lib/acts-as-taggable-on.rb
|
31
33
|
- lib/acts_as_taggable_on/acts_as_taggable_on.rb
|
32
34
|
- lib/acts_as_taggable_on/acts_as_tagger.rb
|