diff --git a/lib/friendly_id/scoped.rb b/lib/friendly_id/scoped.rb index 92b3dd7e2..4bb072168 100644 --- a/lib/friendly_id/scoped.rb +++ b/lib/friendly_id/scoped.rb @@ -127,13 +127,13 @@ def scope_for_slug_generator relation = relation.where(column => send(column)) end if changed.include?(friendly_id_config.slug_column) - column = self.class.quoted_table_name + '.' + self.class.quoted_primary_key - relation = relation.where("#{column} <> ?", send(self.class.primary_key)) + primary_key_name = self.class.primary_key + relation = relation.where.not(primary_key_name => send(primary_key_name)) end relation end private :scope_for_slug_generator - + def slug_generator friendly_id_config.slug_generator_class.new(scope_for_slug_generator) end diff --git a/lib/friendly_id/slugged.rb b/lib/friendly_id/slugged.rb index e8b7186dc..63d3017a1 100644 --- a/lib/friendly_id/slugged.rb +++ b/lib/friendly_id/slugged.rb @@ -302,8 +302,8 @@ def scope_for_slug_generator scope = scope.friendly unless friendly_id_config.uses? :finders if changed.include?(friendly_id_config.slug_column) - column = self.class.quoted_table_name + '.' + self.class.quoted_primary_key - scope = scope.where("#{column} <> ?", send(self.class.primary_key)) + primary_key_name = self.class.primary_key + scope = scope.where.not(primary_key_name => send(primary_key_name)) end scope end diff --git a/test/scoped_test.rb b/test/scoped_test.rb index 5d92d4bad..57f867ba0 100644 --- a/test/scoped_test.rb +++ b/test/scoped_test.rb @@ -10,6 +10,10 @@ class Novel < ActiveRecord::Base belongs_to :novelist belongs_to :publisher friendly_id :name, :use => :scoped, :scope => [:publisher, :novelist] + + def should_generate_new_friendly_id? + new_record? || super + end end class Publisher < ActiveRecord::Base @@ -54,6 +58,36 @@ def model_class end end + test "should not allow duplicate slugs inside scope after regeneration for persisted record" do + with_instance_of Novelist do |novelist| + novel1 = Novel.create! :name => "a", :novelist => novelist + novel2 = Novel.new :name => "a", :novelist => novelist + novel2.save! + + novel2.send(:set_slug) + first_generated_friendly_id = novel2.friendly_id + novel2.send(:set_slug) + second_generated_friendly_id = novel2.friendly_id + + assert novel1.friendly_id != novel2.friendly_id + end + end + + test "should not allow duplicate slugs inside scope after regeneration for new record" do + with_instance_of Novelist do |novelist| + novel1 = Novel.create! :name => "a", :novelist => novelist + novel2 = Novel.new :name => "a", :novelist => novelist + + novel2.send(:set_slug) + first_generated_friendly_id = novel2.friendly_id + novel2.send(:set_slug) + second_generated_friendly_id = novel2.friendly_id + novel2.save! + + assert novel1.friendly_id != novel2.friendly_id + end + end + test "should apply scope with multiple columns" do transaction do novelist = Novelist.create! :name => "a" diff --git a/test/slugged_test.rb b/test/slugged_test.rb index 09cdfd0aa..ad50ff17e 100644 --- a/test/slugged_test.rb +++ b/test/slugged_test.rb @@ -141,6 +141,35 @@ def model_class end end + test "should not allow duplicate slugs after regeneration for persisted record" do + transaction do + model1 = model_class.create! :name => "a" + model2 = model_class.new :name => "a" + model2.save! + + model2.send(:set_slug) + first_generated_friendly_id = model2.friendly_id + model2.send(:set_slug) + second_generated_friendly_id = model2.friendly_id + + assert model1.friendly_id != model2.friendly_id + end + end + + test "should not allow duplicate slugs after regeneration for new record" do + transaction do + model1 = model_class.create! :name => "a" + model2 = model_class.new :name => "a" + + model2.send(:set_slug) + first_generated_friendly_id = model2.friendly_id + model2.send(:set_slug) + second_generated_friendly_id = model2.friendly_id + + assert model1.friendly_id != model2.friendly_id + end + end + end class SlugSeparatorTest < MiniTest::Unit::TestCase @@ -220,7 +249,7 @@ class MenuItem < ActiveRecord::Base friendly_id :name, :use => :slugged before_create :init_primary_key - def self.primary_key + def self.primary_key "string_key" end