Ruby on rails id已存在时创建失败

Ruby on rails id已存在时创建失败,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在使用rake任务用一些初始数据填充我的数据库。我想在一个表中创建一组条目,带有前几个ID,所以它们总是存在,并且总是有这些ID。我不介意在开发环境中,是否有人添加/删除/修改记录,但我始终希望前5个ID具有值。下面是我的lib/tasks/bootstrap.rb文件的简化版本: namespace :bootstrap do desc "Create the default problem types" task :default_problem_types =>

我正在使用rake任务用一些初始数据填充我的数据库。我想在一个表中创建一组条目,带有前几个ID,所以它们总是存在,并且总是有这些ID。我不介意在开发环境中,是否有人添加/删除/修改记录,但我始终希望前5个ID具有值。下面是我的lib/tasks/bootstrap.rb文件的简化版本:

namespace :bootstrap do
    desc "Create the default problem types"
    task :default_problem_types => :environment do
        ProblemType.create( :id => 1, :name => 'Wrong location', :description => 'blah' )
        ProblemType.create( :id => 2, :name =>  'Wrong name', :description => 'blah' )
        ProblemType.create( :id => 3, :name =>  'Wrong details', :description => 'blah' )
        ProblemType.create( :id => 4, :name =>  'Duplicate', :description => 'blah' )
        ProblemType.create( :id => 5, :name =>  'No longer exists', :description => 'blah' )
    end

    desc "Run all bootstrapping tasks"
    task :all => [:default_problem_types]
end
这在空数据库上运行良好。它在问题类型表中创建5个新条目:

1 - Wrong Location 
2 - Wrong name 
3 - Wrong details 
4 - Duplicate 
5 - No longer exists
问题是,如果我再次运行它,它将创建5条新记录,ID为6、7、8、9、10。尽管我为已经存在的create()调用提供了ID,但这是事实。我希望这些调用会失败,因为如果我尝试执行以下SQL操作:

insert into problem_types (id, name, description) values (1, 'foo', 'bar');
。。。它失败了:

错误1062(23000):键“PRIMARY”的重复条目“1”

如果ID已经存在,如何使create()方法失败


谢谢。

经验法则:你不能自己分配ID。让数据库完成它的工作。如果希望问题名称是唯一的,则可以将
验证:name的唯一性\u
添加到模型文件中,并且如果存在相同的名称,则不会创建记录使用动态
查找或创建方法
查找或初始化方法。您可以在中阅读有关这些的更多信息。它们允许您为每个
ProblemType
编写类似的内容,而无需按名称创建重复项:

problem_type = ProblemType.find_or_initialize_by_name('Wrong location')
problem_type.description = "blah"
problem_type.save

我同意@benchwarmer;最好避免自己管理主键。如果您必须有一个数字标识符来表示某个语义值,请尝试添加一个单独的列并相应地设置该值。

为什么要使用rake任务而不是seeds?对于seeds,如果你正确地清理了数据库,你总是可以得到1-5id。我使用rake任务是因为我遇到了另一篇推荐这一点的帖子,而我对seeds并不熟悉。但是,在阅读您的评论后,我查找了种子,认为种子更合适。我正在切换到种子,但当我执行ProblemType.delete_all时,然后重新创建它们,(使用ProblemType.find_或_initialize_by_name())ID不会从1-5开始;它们不断增加。(我在本地使用mySQL)。有没有其他方法可以正确地清理数据库?有一种叫做数据库清理器的gem,可以使用它。是的,我不太关心ID是1-5,因为我没有重复的ID@rossta建议使用这个名称(find_或通过_name初始化_)成功了。