Skip to content

Commit

Permalink
use of #{primary_key} instead of .id
Browse files Browse the repository at this point in the history
  • Loading branch information
bernardkroes committed Aug 20, 2011
1 parent 20599f0 commit 4ec1a4e
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 13 deletions.
6 changes: 3 additions & 3 deletions lib/acts_as_taggable_on/acts_as_taggable_on/core.rb
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
14 changes: 7 additions & 7 deletions lib/acts_as_taggable_on/acts_as_taggable_on/related.rb
Expand Up @@ -44,30 +44,30 @@ 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

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
end
2 changes: 1 addition & 1 deletion spec/acts_as_taggable_on/taggable_spec.rb
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion spec/database.yml.sample
Expand Up @@ -16,4 +16,4 @@ postgresql:
username: postgres
password:
database: acts_as_taggable_on
encoding: utf8
encoding: utf8
3 changes: 2 additions & 1 deletion 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
Expand Down Expand Up @@ -32,4 +33,4 @@ class TaggableUser < ActiveRecord::Base

class UntaggableModel < ActiveRecord::Base
belongs_to :taggable_model
end
end
1 change: 1 addition & 0 deletions spec/schema.rb
Expand Up @@ -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
Expand Down

0 comments on commit 4ec1a4e

Please sign in to comment.