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

发布于 2024-12-15 12:51:51 字数 555 浏览 3 评论 0原文

我在迁移时的 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,所以我应该只使用模型 Colordestroy_all 方法吗?

I have the following defined on my up method on my migration to set initial data:

  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

Is there any truncate directive I can put on the down method like:

def down
   Color.truncate
end

Or since I'm setting the IDs on the create should I use only the destroy_all method of the model Color ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一抹淡然 2024-12-22 12:51:52

您可以在 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

干杯!

You can simple use this in your up method, this will solve your both truncate and id resetting problem also.

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

Cheers!

一曲琵琶半遮面シ 2024-12-22 12:51:52

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

其次,在迁移中使用 ActiveRecord 查询生成器并不是一个好的做法,因为如果模型颜色名称发生更改,迁移就会中断。我强烈建议您使用纯 SQL 并使用 execute() 执行该查询。

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

我会这样写:

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

Firstly, you don't have to pass :id into create! because ActiveRecord will automatically handle that, thus :id likely to get ignored (standard case assumed).

Secondly, it is not a good practice to use ActiveRecord query builder in migration because should the model Color name be changed, you are to have a broken migration. I highly recommend you to use pure SQL and execute that query with execute().

Thirdly, for the #down method, you shouldn't truncate the table. You should destroy those 4 colors that you created in #up.

Here's how I would write it:

def down
  colors = ["FF6633", "93B233", "4D90D9", "C43092"]
  Color.where(:color => colors).destroy_all
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文