关于ActiveRecord Rails 3.1的迁移向下方法的截断表

时间:2011-11-15 15:43:47

标签: ruby-on-rails-3 activerecord truncate rails-migrations

我在迁移时使用up方法定义了以下内容以设置初始数据:

  def up
    Color.create!({:id=>1,:name=>"",:color=>"FF6633"})
    Color.create!({:id=>2,:name=>"",:color=>"93B233"})
    Color.create!({:id=>3,:name=>"",:color=>"4D90D9"})
    Color.create!({:id=>4,:name=>"",:color=>"C43092"})
  end

我可以在truncate方法上使用down指令,如:

def down
   Color.truncate
end

或者,因为我在创建时设置了ID,我应该只使用模型destroy_all的{​​{1}}方法吗?

2 个答案:

答案 0 :(得分:7)

您可以在 up 方法中简单地使用它,这也将解决您的截断和ID重置问题。

def up    
   ActiveRecord::Base.connection.execute("TRUNCATE table_name")  
   Color.create!({:id=>1,:name=>"",:color=>"FF6633"})  
   Color.create!({:id=>2,:name=>"",:color=>"93B233"})  
   Color.create!({:id=>3,:name=>"",:color=>"4D90D9"})  
   Color.create!({:id=>4,:name=>"",:color=>"C43092"})  
end

干杯!

答案 1 :(得分:0)

首先,您不必将:id传递给create!,因为ActiveRecord会自动处理,:id可能会被忽略(假设标准情况)。

其次,在迁移中使用ActiveRecord查询构建器不是一个好习惯,因为如果要更改模型Color名称,那么迁移将会中断。我强烈建议您使用纯SQL并使用execute()执行该查询。

第三,对于#down方法,不应截断表。您应该销毁在#up中创建的4种颜色。

以下是我的写作方式:

def down
  colors = ["FF6633", "93B233", "4D90D9", "C43092"]
  Color.where(:color => colors).destroy_all
end