diff --git a/lib/friendly_id/scoped.rb b/lib/friendly_id/scoped.rb index aa1fdefdd..14ded01b0 100644 --- a/lib/friendly_id/scoped.rb +++ b/lib/friendly_id/scoped.rb @@ -123,13 +123,13 @@ def serialized_scope def scope_for_slug_generator relation = self.class.unscoped.friendly + primary_key_name = self.class.primary_key + friendly_id_config.scope_columns.each do |column| relation = relation.where(column => send(column)) end - if changed.include?(friendly_id_config.slug_column) - primary_key_name = self.class.primary_key - relation = relation.where.not(primary_key_name => send(primary_key_name)) - end + relation = relation.where.not(primary_key_name => send(primary_key_name)) + relation end private :scope_for_slug_generator diff --git a/lib/friendly_id/slugged.rb b/lib/friendly_id/slugged.rb index 61d613b1d..0ba8e7cad 100644 --- a/lib/friendly_id/slugged.rb +++ b/lib/friendly_id/slugged.rb @@ -298,13 +298,12 @@ def set_slug(normalized_slug = nil) private :set_slug def scope_for_slug_generator + primary_key_name = self.class.primary_key + scope = self.class.base_class.unscoped scope = scope.friendly unless scope.respond_to?(:exists_by_friendly_id?) + scope = scope.where.not(primary_key_name => send(primary_key_name)) - if changed.include?(friendly_id_config.slug_column) - primary_key_name = self.class.primary_key - scope = scope.where.not(primary_key_name => send(primary_key_name)) - end scope end private :scope_for_slug_generator diff --git a/test/scoped_test.rb b/test/scoped_test.rb index 57f867ba0..df250b1da 100644 --- a/test/scoped_test.rb +++ b/test/scoped_test.rb @@ -12,7 +12,7 @@ class Novel < ActiveRecord::Base friendly_id :name, :use => :scoped, :scope => [:publisher, :novelist] def should_generate_new_friendly_id? - new_record? || super + name_changed? || new_record? || super end end @@ -112,4 +112,13 @@ def model_class assert_equal old_id, record.friendly_id end end + + test 'should allow a record to reuse its own slug when other attr changed' do + with_instance_of(model_class) do |record| + old_id = record.friendly_id + record.name = "A-B-C" + record.save! + assert_equal old_id, record.friendly_id + end + end end diff --git a/test/slugged_test.rb b/test/slugged_test.rb index ad50ff17e..3300bb22d 100644 --- a/test/slugged_test.rb +++ b/test/slugged_test.rb @@ -3,6 +3,10 @@ class Journalist < ActiveRecord::Base extend FriendlyId friendly_id :name, :use => :slugged + + def should_generate_new_friendly_id? + name_changed? || super + end end class Article < ActiveRecord::Base @@ -77,6 +81,15 @@ def self.name assert_equal old_id, record.friendly_id end end + + test 'should allow record to reuse slug when other attr changed' do + with_instance_of(model_class) do |record| + old_id = record.friendly_id + record.name = "A-B-C" + record.save! + assert_equal old_id, record.friendly_id + end + end end class SlugGeneratorTest < MiniTest::Unit::TestCase