Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
adding tagged_with_any to find models with any of the given tags
Signed-off-by: Snax Fauna <evan+fauna@cloudbur.st>
  • Loading branch information
saturnflyer authored and Snax Fauna committed Feb 2, 2009
1 parent 227a941 commit bcd9626
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions generators/tagging/templates/tagging_extensions.rb
Expand Up @@ -147,6 +147,47 @@ def tagged_with(*tag_list)


find_by_sql(sql) find_by_sql(sql)
end end

def self.tagged_with_any(*tag_list)
options = tag_list.last.is_a?(Hash) ? tag_list.pop : {}
tag_list = parse_tags(tag_list)

scope = scope(:find)
options[:select] ||= "#{table_name}.*"
options[:from] ||= "#{table_name}, meta_tags, taggings"

sql = "SELECT #{(scope && scope[:select]) || options[:select]} "
sql << "FROM #{(scope && scope[:from]) || options[:from]} "

add_joins!(sql, options, scope)

sql << "WHERE #{table_name}.#{primary_key} = taggings.taggable_id "
sql << "AND taggings.taggable_type = '#{ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s}' "
sql << "AND taggings.meta_tag_id = meta_tags.id "

sql << "AND ("
or_options = []
tag_list.each do |name|
or_options << "meta_tags.name = '#{name}'"
end
or_options_joined = or_options.join(" OR ")
sql << "#{or_options_joined}) "


sql << "AND #{sanitize_sql(options[:conditions])} " if options[:conditions]

columns = column_names.map do |column|
"#{table_name}.#{column}"
end.join(", ")

sql << "GROUP BY #{columns} "

add_order!(sql, options[:order], scope)
add_limit!(sql, options, scope)
add_lock!(sql, options, scope)

find_by_sql(sql)
end


def parse_tags(tags) def parse_tags(tags)
return [] if tags.blank? return [] if tags.blank?
Expand Down

0 comments on commit bcd9626

Please sign in to comment.