如何使用Friendly_Id w/STI?

问题描述:

对于如何设置friendly_id(4.0.0.beta12)gem来正确使用STI模型,我非常难过。如何使用Friendly_Id w/STI?

这里是模型设置:

class Car < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, :use => :slugged 
end 

class Ford < Car 
end 

class Toyota < Car 
end 

如果我尝试这样的事:

Toyota.create!(name: "test") 
Ford.create!(name: "test") 

产生的错误是:

(0.1ms) BEGIN 
    Ford Load (0.2ms) SELECT `cars`.* FROM `cars` WHERE `cars`.`type` IN ('Ford') AND (`slug` = 'test' OR `slug` LIKE 'test--%') AND (id <> 7606) ORDER BY LENGTH(`slug`) DESC, `slug` DESC LIMIT 1 
    (0.5ms) UPDATE `cars` SET `slug` = 'test', `updated_at` = '2011-09-30 15:06:08' WHERE `cars`.`type` IN ('Ford') AND `cars`.`id` = 7606 
    (0.1ms) ROLLBACK 
ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'test' for key 2: UPDATE `cars` SET `slug` = 'test', `updated_at` = '2011-09-30 15:06:08' WHERE `cars`.`type` IN ('Ford') AND `cars`.`id` = 7606 

的问题是,friendly_id的选择容貌对于设置为“福特”的类型的slu and,出现干净(因为slu''测试'已经属于记录类型'丰田')。假设没有名称为'test'的slu exists存在,它会尝试用slu'测试'来保存记录,所有事情都会下到地狱。

任何想法?

谢谢!

+0

什么版本friendly_id您使用的是? –

+0

嗨纳什,我使用friendly_id(4.0.0.beta12)(更新了这个问题)谢谢。 –

+0

我应该补充一点,在我的gem文件中,我有'gem'friendly_id','〜> 4.0.0.beta8',但4.0.0.beta12是我安装时运行'bundle install' –

也许你可以添加一个时间戳到id,它会停止冲突。虽然这不是理想的解决方案。

+0

这是一个很好的想法,并会工作,但是这不是理想的。使用slu reason的原因通常是为了更清晰的网址,并且这种打错了目的。如果您有兴趣,我在下面发布了一个链接,其中提供了一个来自gem作者的解决方案。 –