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

6
我在我的迁移中的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

down方法中是否有任何可用的truncate指令,例如:

def down
   Color.truncate
end

或者,既然我在创建时设置了ID,那么我应该只使用模型 Colordestroy_all 方法吗?

2个回答

8
您可以在您的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
首先,在create!中不需要传递:id,因为ActiveRecord会自动处理它,因此:id可能会被忽略(假设是标准情况)。
其次,在迁移中使用ActiveRecord查询构建器并不是一个好的实践,因为如果模型Color的名称被更改,你将会有一个破损的迁移。我强烈建议你使用纯SQL并使用execute()执行该查询。
第三,在#down方法中,你不应该截断表。你应该销毁在#up中创建的那4个颜色。
以下是我的写法:
def down
  colors = ["FF6633", "93B233", "4D90D9", "C43092"]
  Color.where(:color => colors).destroy_all
end

3
当来回迁移时,如何保持id不变呢?如果在#down中只是使用destroy来删除那4个颜色,在再次运行迁移时id将会变成5,6,7,8,而实际上需要保留的是1,2,3,4 - Mr_Nizzle
首先,虽然传递id并不是一个好主意,但在某些情况下你必须这样做(从概念上讲)。将两个旧表合并为一个新表时,需要保持id不变以维护现有的关联。其次,您确实可以使用ActiveRecord查询来操作迁移内部的数据,但应创建包装表的类的虚拟版本。这将保护您免受缺少源文件的影响,但您受到标准模型行为的限制。 - user483040

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接