rocket_tag 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/rocket_tag/taggable.rb +37 -19
- data/rocket_tag.gemspec +2 -2
- data/spec/rocket_tag/taggable_spec.rb +0 -49
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/rocket_tag/taggable.rb
CHANGED
@@ -62,37 +62,55 @@ module RocketTag
|
|
62
62
|
@rocket_tag ||= RocketTag::Taggable::Manager.new(self)
|
63
63
|
end
|
64
64
|
|
65
|
-
def
|
65
|
+
def _with_tag_context context
|
66
66
|
if context
|
67
67
|
where{taggings.context == my{context} }
|
68
68
|
else
|
69
|
-
where{}
|
69
|
+
where{ }
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
73
|
+
def _with_all condition, tags_list
|
74
|
+
if condition
|
75
|
+
group{~id}.
|
76
|
+
having{count(~id)==my{tags_list.length}}
|
77
|
+
else
|
78
|
+
where{}
|
79
|
+
end
|
80
|
+
end
|
74
81
|
|
82
|
+
# Generates a sifter or a where clause depending on options.
|
83
|
+
# The sifter generates a subselect with the body of the
|
84
|
+
# clause wrapped up so that it can be used as a condition
|
85
|
+
# within another squeel statement.
|
86
|
+
#
|
87
|
+
# Query optimization is left up to the SQL engine.
|
88
|
+
def tagged_with_sifter tags_list, options = {}
|
75
89
|
on = options.delete :on
|
76
90
|
all = options.delete :all
|
77
91
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
92
|
+
proc do |&block|
|
93
|
+
if options.delete :where
|
94
|
+
where &block
|
95
|
+
else
|
96
|
+
squeel &block
|
97
|
+
end
|
98
|
+
end.call {
|
99
|
+
id.in(
|
100
|
+
my{self}.
|
101
|
+
select{id}.
|
102
|
+
joins{tags}.
|
103
|
+
where{ tags.name.in(my{tags_list})}.
|
104
|
+
_with_tag_context(my{on}).
|
105
|
+
_with_all(my{all}, my{tags_list})
|
106
|
+
)
|
107
|
+
}
|
93
108
|
|
94
|
-
|
109
|
+
end
|
95
110
|
|
111
|
+
def tagged_with tags_list, options = {}
|
112
|
+
options[:where] = true
|
113
|
+
tagged_with_sifter(tags_list, options)
|
96
114
|
end
|
97
115
|
|
98
116
|
def attr_taggable *contexts
|
data/rocket_tag.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rocket_tag}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Brad Phelan}]
|
12
|
-
s.date = %q{2011-09-
|
12
|
+
s.date = %q{2011-09-19}
|
13
13
|
s.description = %q{}
|
14
14
|
s.email = %q{bradphelan@xtargets.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -56,55 +56,6 @@ describe TaggableModel do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
it "allows me to get funky with Squeel and ActiveRelation" do
|
61
|
-
|
62
|
-
sql = <<-EOF.gsub(/\s+/, ' ').strip
|
63
|
-
SELECT "taggable_models".*
|
64
|
-
FROM "taggable_models"
|
65
|
-
INNER JOIN "taggings"
|
66
|
-
ON "taggings"."taggable_id" = "taggable_models"."id"
|
67
|
-
AND "taggings"."taggable_type" = 'TaggableModel'
|
68
|
-
INNER JOIN "tags"
|
69
|
-
ON "tags"."id" = "taggings"."tag_id"
|
70
|
-
AND taggings.context = 'skills'
|
71
|
-
WHERE
|
72
|
-
"tags"."name" = 'foo'
|
73
|
-
EOF
|
74
|
-
|
75
|
-
TaggableModel.joins{skills_tags}.where{skills_tags.name == "foo"}.to_sql.should == sql
|
76
|
-
|
77
|
-
sql = <<-EOF.gsub(/\s+/, ' ').strip
|
78
|
-
SELECT distinct taggable_models.*
|
79
|
-
FROM "taggable_models"
|
80
|
-
INNER JOIN "taggings"
|
81
|
-
ON
|
82
|
-
"taggings"."taggable_id" = "taggable_models"."id"
|
83
|
-
AND
|
84
|
-
"taggings"."taggable_type" = 'TaggableModel'
|
85
|
-
INNER JOIN "tags"
|
86
|
-
ON
|
87
|
-
"tags"."id" = "taggings"."tag_id"
|
88
|
-
WHERE
|
89
|
-
"taggable_models"."id" IN
|
90
|
-
(SELECT "taggable_models"."id"
|
91
|
-
FROM "taggable_models"
|
92
|
-
INNER JOIN "taggings"
|
93
|
-
ON "taggings"."taggable_id" = "taggable_models"."id"
|
94
|
-
AND "taggings"."taggable_type" = 'TaggableModel'
|
95
|
-
INNER JOIN "tags"
|
96
|
-
ON "tags"."id" = "taggings"."tag_id" WHERE "tags"."name"
|
97
|
-
IN ('a', 'b')
|
98
|
-
GROUP BY "taggable_models"."id"
|
99
|
-
HAVING count("taggable_models"."id") = 2)
|
100
|
-
AND
|
101
|
-
(created_at > '2011-09-16 05:41')
|
102
|
-
EOF
|
103
|
-
|
104
|
-
TaggableModel.tagged_with(["a", "b"], :all =>true).where(["created_at > ?", "2011-09-16 05:41"]).to_sql.should == sql
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
59
|
describe "combining with active relation" do
|
109
60
|
before :each do
|
110
61
|
TaggableModel.create :name => "test 0", :needs => %w[x y z]
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rocket_tag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Brad Phelan
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-19 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -143,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
143
|
requirements:
|
144
144
|
- - ">="
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
hash: -
|
146
|
+
hash: -1469878759169325224
|
147
147
|
segments:
|
148
148
|
- 0
|
149
149
|
version: "0"
|