2013-02-18 87 views
0

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

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 

能正常工作的空数据库。它创建于problem_types表5个新条目:

1 - Wrong Location 
2 - Wrong name 
3 - Wrong details 
4 - Duplicate 
5 - No longer exists 

的问题是,如果我运行它第二次,它会创建5分新的记录,使用标识6,7,8,9,10,这就是尽管事实上,我向已经存在的create()调用提供了id。我期待这些呼叫失败,因为如果我尝试做以下SQL:

insert into problem_types (id, name, description) values (1, 'foo', 'bar'); 

...失败:

ERROR 1062(23000):对于重复键输入'1' PRIMARY'

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

谢谢。

+1

你为什么使用rake任务而不是种子?使用种子,如果你正确地清理你的数据库,你总是可以有1-5的id。 – 2013-02-18 21:00:30

+0

我正在使用rake任务,因为我遇到了另一个推荐的帖子,而我对种子并不熟悉。但是,在阅读您的评论之后,我查了一下种子,并认为种子更合适。 – antun 2013-02-19 22:10:04

+0

我正在切换到种子,但是当我执行ProblemType.delete_all时,然后重新创建它们(使用ProblemType.find_or_initialize_by_name()),ID不会从1-5开始;他们不断增加。 (我在本地使用mySQL)。是否有另一种方法来正确清理数据库? – antun 2013-02-26 03:40:27

回答

0

使用动态find_or_create_byfind_or_initialize_by方法记录将不会被创建。您可以在Rails guides for the Active Record query interface中阅读更多关于这些内容的内容。他们让你写这样的事情每个ProblemType没有按名称创建重复:

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

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

+0

find_or_initialize_by_name方法适用于我。谢谢! – antun 2013-02-19 22:12:02

0

经验法则:你不要自己分配ID。让数据库完成它的工作。如果你想你的问题的名字是唯一的,那么你可以添加到validates_uniqueness_of :name模型文件,如果存在同名

+0

是的,我不关心ID为1-5,因为我没有重复。 @ rossta关于使用名称(find_or_initialize_by_name)的建议诀窍。 – antun 2013-02-19 22:13:24

相关问题