Skip to content

Commit

Permalink
No commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
jviney committed Oct 21, 2007
1 parent 41a16e3 commit 9110954
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 7 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG
@@ -1,3 +1,7 @@
[22 October 2007]

* Fix find_tagged_with using :match_all and :include.

[15 October 2007]

* Make find_tagged_with correctly apply :conditions
Expand Down
15 changes: 10 additions & 5 deletions lib/acts_as_taggable.rb
Expand Up @@ -54,18 +54,23 @@ def find_options_for_find_tagged_with(tags, options = {})
tags_conditions = tags.map { |t| sanitize_sql(["#{Tag.table_name}.name LIKE ?", t]) }.join(" OR ")
conditions << sanitize_sql(["#{table_name}.id NOT IN (SELECT #{Tagging.table_name}.taggable_id FROM #{Tagging.table_name} LEFT OUTER JOIN #{Tag.table_name} ON #{Tagging.table_name}.tag_id = #{Tag.table_name}.id WHERE (#{tags_conditions}) AND #{Tagging.table_name}.taggable_type = #{quote_value(base_class.name)})", tags])
else
conditions << "(" + tags.map { |t| sanitize_sql(["#{tags_alias}.name LIKE ?", t]) }.join(" OR ") + ")"

if options.delete(:match_all)
group = "#{taggings_alias}.taggable_id HAVING COUNT(#{taggings_alias}.taggable_id) = #{tags.size}"
conditions << <<-END
(SELECT COUNT(*) FROM #{Tagging.table_name}
LEFT OUTER JOIN #{Tag.table_name} ON #{Tagging.table_name}.tag_id = #{Tag.table_name}.id
WHERE #{Tagging.table_name}.taggable_type = #{quote_value(base_class.name)} AND
taggable_id = #{table_name}.id AND
(#{tags.map { |t| sanitize_sql(["#{Tag.table_name}.name LIKE ?", t]) }.join(" OR ")})) = #{tags.size}
END
else
conditions << "(" + tags.map { |t| sanitize_sql(["#{tags_alias}.name LIKE ?", t]) }.join(" OR ") + ")"
end
end

{ :select => "DISTINCT #{table_name}.*",
:joins => "LEFT OUTER JOIN #{Tagging.table_name} #{taggings_alias} ON #{taggings_alias}.taggable_id = #{table_name}.#{primary_key} AND #{taggings_alias}.taggable_type = #{quote_value(base_class.name)} " +
"LEFT OUTER JOIN #{Tag.table_name} #{tags_alias} ON #{tags_alias}.id = #{taggings_alias}.tag_id",
:conditions => conditions.join(" AND "),
:group => group
:conditions => conditions.join(" AND ")
}.update(options)
end

Expand Down
7 changes: 5 additions & 2 deletions test/acts_as_taggable_test.rb
Expand Up @@ -28,9 +28,12 @@ def test_find_tagged_with_nonexistant_tags
assert_equal [], Photo.find_tagged_with([Tag.new(:name => 'unsaved tag')])
end

def test_find_tagged_with_matching_all_tags
def test_find_tagged_with_match_all
assert_equivalent [photos(:jonathan_dog)], Photo.find_tagged_with('Crazy animal, "Nature"', :match_all => true)
assert_equivalent [posts(:jonathan_sky), posts(:sam_flowers)], Post.find_tagged_with(['Very good', 'Nature'], :match_all => true)
end

def test_find_tagged_with_match_all_and_include
assert_equivalent [posts(:jonathan_sky), posts(:sam_flowers)], Post.find_tagged_with(['Very good', 'Nature'], :match_all => true, :include => :tags)
end

def test_find_tagged_with_conditions
Expand Down

0 comments on commit 9110954

Please sign in to comment.