From 4ec1a4e801e2cc287fed5a8ad08625b223e978ea Mon Sep 17 00:00:00 2001 From: Bernard Kroes Date: Sat, 20 Aug 2011 17:41:31 +0200 Subject: [PATCH] use of #{primary_key} instead of .id --- .../acts_as_taggable_on/core.rb | 6 +++--- .../acts_as_taggable_on/related.rb | 14 +++++++------- spec/acts_as_taggable_on/taggable_spec.rb | 2 +- spec/database.yml.sample | 2 +- spec/models.rb | 3 ++- spec/schema.rb | 1 + 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb b/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb index a2c1a04bc..25615bdc6 100644 --- a/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb +++ b/lib/acts_as_taggable_on/acts_as_taggable_on/core.rb @@ -21,7 +21,7 @@ def initialize_acts_as_taggable_on_core class_eval do has_many context_taggings, :as => :taggable, :dependent => :destroy, :include => :tag, :class_name => "ActsAsTaggableOn::Tagging", - :conditions => ["#{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.id AND #{ActsAsTaggableOn::Tagging.table_name}.context = ?", tags_type] + :conditions => ["#{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key} AND #{ActsAsTaggableOn::Tagging.table_name}.context = ?", tags_type] has_many context_tags, :through => context_taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag" end @@ -79,7 +79,7 @@ def tagged_with(tags, options = {}) if options.delete(:exclude) tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name #{like_operator} ?", t]) }.join(" OR ") - conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{ActsAsTaggableOn::Tagging.table_name}.taggable_id FROM #{ActsAsTaggableOn::Tagging.table_name} JOIN #{ActsAsTaggableOn::Tag.table_name} ON #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.id AND (#{tags_conditions}) WHERE #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = #{quote_value(base_class.name)})" + conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{ActsAsTaggableOn::Tagging.table_name}.taggable_id FROM #{ActsAsTaggableOn::Tagging.table_name} JOIN #{ActsAsTaggableOn::Tag.table_name} ON #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key} AND (#{tags_conditions}) WHERE #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = #{quote_value(base_class.name)})" elsif options.delete(:any) # get tags, drop out if nothing returned (we need at least one) @@ -256,7 +256,7 @@ def save_tags if old_taggings.present? # Destroy old taggings: - ActsAsTaggableOn::Tagging.destroy_all :id => old_taggings.map(&:id) + ActsAsTaggableOn::Tagging.destroy_all "#{ActsAsTaggableOn::Tagging.primary_key}".to_sym => old_taggings.map(&:id) end # Create new taggings: diff --git a/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb b/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb index e9093e6fb..cdb846136 100644 --- a/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb +++ b/lib/acts_as_taggable_on/acts_as_taggable_on/related.rb @@ -44,13 +44,13 @@ module InstanceMethods def matching_contexts_for(search_context, result_context, klass, options = {}) tags_to_find = tags_on(search_context).collect { |t| t.name } - exclude_self = "#{klass.table_name}.id != #{id} AND" if self.class == klass + exclude_self = "#{klass.table_name}.#{klass.primary_key} != #{id} AND" if self.class == klass group_columns = ActsAsTaggableOn::Tag.using_postgresql? ? grouped_column_names_for(klass) : "#{klass.table_name}.#{klass.primary_key}" - klass.scoped({ :select => "#{klass.table_name}.*, COUNT(#{ActsAsTaggableOn::Tag.table_name}.id) AS count", + klass.scoped({ :select => "#{klass.table_name}.*, COUNT(#{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key}) AS count", :from => "#{klass.table_name}, #{ActsAsTaggableOn::Tag.table_name}, #{ActsAsTaggableOn::Tagging.table_name}", - :conditions => ["#{exclude_self} #{klass.table_name}.id = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id AND #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = '#{klass.to_s}' AND #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.id AND #{ActsAsTaggableOn::Tag.table_name}.name IN (?) AND #{ActsAsTaggableOn::Tagging.table_name}.context = ?", tags_to_find, result_context], + :conditions => ["#{exclude_self} #{klass.table_name}.#{klass.primary_key} = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id AND #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = '#{klass.to_s}' AND #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key} AND #{ActsAsTaggableOn::Tag.table_name}.name IN (?) AND #{ActsAsTaggableOn::Tagging.table_name}.context = ?", tags_to_find, result_context], :group => group_columns, :order => "count DESC" }.update(options)) end @@ -58,16 +58,16 @@ def matching_contexts_for(search_context, result_context, klass, options = {}) def related_tags_for(context, klass, options = {}) tags_to_find = tags_on(context).collect { |t| t.name } - exclude_self = "#{klass.table_name}.id != #{id} AND" if self.class == klass + exclude_self = "#{klass.table_name}.#{klass.primary_key} != #{id} AND" if self.class == klass group_columns = ActsAsTaggableOn::Tag.using_postgresql? ? grouped_column_names_for(klass) : "#{klass.table_name}.#{klass.primary_key}" - klass.scoped({ :select => "#{klass.table_name}.*, COUNT(#{ActsAsTaggableOn::Tag.table_name}.id) AS count", + klass.scoped({ :select => "#{klass.table_name}.*, COUNT(#{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key}) AS count", :from => "#{klass.table_name}, #{ActsAsTaggableOn::Tag.table_name}, #{ActsAsTaggableOn::Tagging.table_name}", - :conditions => ["#{exclude_self} #{klass.table_name}.id = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id AND #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = '#{klass.to_s}' AND #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.id AND #{ActsAsTaggableOn::Tag.table_name}.name IN (?)", tags_to_find], + :conditions => ["#{exclude_self} #{klass.table_name}.#{klass.primary_key} = #{ActsAsTaggableOn::Tagging.table_name}.taggable_id AND #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = '#{klass.to_s}' AND #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key} AND #{ActsAsTaggableOn::Tag.table_name}.name IN (?)", tags_to_find], :group => group_columns, :order => "count DESC" }.update(options)) end end end -end \ No newline at end of file +end diff --git a/spec/acts_as_taggable_on/taggable_spec.rb b/spec/acts_as_taggable_on/taggable_spec.rb index a933e74e5..730c19632 100644 --- a/spec/acts_as_taggable_on/taggable_spec.rb +++ b/spec/acts_as_taggable_on/taggable_spec.rb @@ -294,7 +294,7 @@ end it "should return all column names joined for TaggableModel GROUP clause" do - @taggable.grouped_column_names_for(TaggableModel).should == "taggable_models.id, taggable_models.name, taggable_models.type" + @taggable.grouped_column_names_for(TaggableModel).should == "taggable_models.#{TaggableModel.primary_key}, taggable_models.name, taggable_models.type" end end diff --git a/spec/database.yml.sample b/spec/database.yml.sample index 474610ecf..97652ed57 100644 --- a/spec/database.yml.sample +++ b/spec/database.yml.sample @@ -16,4 +16,4 @@ postgresql: username: postgres password: database: acts_as_taggable_on - encoding: utf8 \ No newline at end of file + encoding: utf8 diff --git a/spec/models.rb b/spec/models.rb index 96380f3be..3964eeaa0 100644 --- a/spec/models.rb +++ b/spec/models.rb @@ -1,4 +1,5 @@ class TaggableModel < ActiveRecord::Base +# set_primary_key "an_id" acts_as_taggable acts_as_taggable_on :languages acts_as_taggable_on :skills @@ -32,4 +33,4 @@ class TaggableUser < ActiveRecord::Base class UntaggableModel < ActiveRecord::Base belongs_to :taggable_model -end \ No newline at end of file +end diff --git a/spec/schema.rb b/spec/schema.rb index 5489496a8..23529d36a 100644 --- a/spec/schema.rb +++ b/spec/schema.rb @@ -16,6 +16,7 @@ t.string "name" end +# create_table :taggable_models, :primary_key => "an_id", :force => true do |t| create_table :taggable_models, :force => true do |t| t.column :name, :string t.column :type, :string