Skip to content

Instantly share code, notes, and snippets.

Created June 17, 2011 17:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/1031854 to your computer and use it in GitHub Desktop.
Save anonymous/1031854 to your computer and use it in GitHub Desktop.
Refactoring acts-as-taggable-on SQL queries to be more readable
def tagged_with(tags, options = {})
tag_list = ActsAsTaggableOn::Taggable::TagList.from(tags)
joins = []
conditions = []
context = options.delete(:on)
context_condition = context.blank? ? "" : sanitize_sql(["AND #{acts_as_taggable_on_tagging_model.table_name}.context = ?", context.to_s])
if options.delete(:exclude)
tags_conditions = tag_list.map { |t| sanitize_sql(["#{acts_as_taggable_on_tag_model.table_name}.name #{ActsAsTaggableOn.like_operator} ?", t]) }.join(" OR ")
conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{acts_as_taggable_on_tagging_model.table_name}.taggable_id FROM #{acts_as_taggable_on_tagging_model.table_name} JOIN #{acts_as_taggable_on_tag_model.table_name} ON #{acts_as_taggable_on_tagging_model.table_name}.tag_id = #{acts_as_taggable_on_tag_model.table_name}.id AND (#{tags_conditions}) WHERE #{acts_as_taggable_on_tagging_model.table_name}.taggable_type = #{quote_value(base_class.name)} #{context_condition})"
elsif options.delete(:any)
tags_conditions = tag_list.map { |t| sanitize_sql(["#{acts_as_taggable_on_tag_model.table_name}.name #{ActsAsTaggableOn.like_operator} ?", t]) }.join(" OR ")
conditions << "#{table_name}.#{primary_key} IN (SELECT #{acts_as_taggable_on_tagging_model.table_name}.taggable_id FROM #{acts_as_taggable_on_tagging_model.table_name} JOIN #{acts_as_taggable_on_tag_model.table_name} ON #{acts_as_taggable_on_tagging_model.table_name}.tag_id = #{acts_as_taggable_on_tag_model.table_name}.id AND (#{tags_conditions}) WHERE #{acts_as_taggable_on_tagging_model.table_name}.taggable_type = #{quote_value(base_class.name)} #{context_condition})"
elsif tag_list.empty? && options(:match_all)
conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{acts_as_taggable_on_tagging_model.table_name}.taggable_id FROM #{acts_as_taggable_on_tagging_model.table_name} WHERE #{acts_as_taggable_on_tagging_model.table_name}.taggable_type = #{quote_value(base_class.name)} #{context_condition})"
end
def tagged_with(tags, options = {})
tag_list = ActsAsTaggableOn::Taggable::TagList.from(tags)
joins = []
conditions = []
context = options.delete(:on)
context_condition = context.blank? ? "" : sanitize_sql(["AND #{acts_as_taggable_on_tagging_model.table_name}.context = ?", context.to_s])
if options.delete(:exclude)
tags_conditions = tag_list.map { |t| sanitize_sql(["#{acts_as_taggable_on_tag_model.table_name}.name #{ActsAsTaggableOn.like_operator} ?", t]) }.join(" OR ")
conditions << <<-SQL
#{table_name}.#{primary_key} NOT IN (
SELECT #{acts_as_taggable_on_tagging_model.table_name}.taggable_id
FROM #{acts_as_taggable_on_tagging_model.table_name}
JOIN #{acts_as_taggable_on_tag_model.table_name}
ON #{acts_as_taggable_on_tagging_model.table_name}.tag_id = #{acts_as_taggable_on_tag_model.table_name}.id
AND (#{tags_conditions})
WHERE #{acts_as_taggable_on_tagging_model.table_name}.taggable_type = #{quote_value(base_class.name)} #{context_condition}
)
SQL
elsif options.delete(:any)
tags_conditions = tag_list.map { |t| sanitize_sql(["#{acts_as_taggable_on_tag_model.table_name}.name #{ActsAsTaggableOn.like_operator} ?", t]) }.join(" OR ")
conditions << <<-SQL
#{table_name}.#{primary_key} IN (
SELECT #{acts_as_taggable_on_tagging_model.table_name}.taggable_id
FROM #{acts_as_taggable_on_tagging_model.table_name}
JOIN #{acts_as_taggable_on_tag_model.table_name}
ON #{acts_as_taggable_on_tagging_model.table_name}.tag_id = #{acts_as_taggable_on_tag_model.table_name}.id
AND (#{tags_conditions})
WHERE #{acts_as_taggable_on_tagging_model.table_name}.taggable_type = #{quote_value(base_class.name)}
#{context_condition}
)
SQL
elsif tag_list.empty? && options(:match_all)
conditions << <<-SQL
#{table_name}.#{primary_key} NOT IN (
SELECT #{acts_as_taggable_on_tagging_model.table_name}.taggable_id
FROM #{acts_as_taggable_on_tagging_model.table_name}
WHERE #{acts_as_taggable_on_tagging_model.table_name}.taggable_type = #{quote_value(base_class.name)}
#{context_condition}
)
SQL
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment