Rails 4:如何通过迁移删除连接表条目?

时间:2015-03-02 17:24:18

标签: ruby-on-rails ruby-on-rails-4 rails-migrations

我在rails中有一个连接表,其中有一些需要删除的条目。

假设联接表名为' products_variants'

我发现我在这个连接表中有一些条目错误地创建了一段时间。我有他们的ID,所以我可以进入phpmyadmin并删除它们,但我想进行迁移,以防任何人使用旧数据库(以前发生过)。

由于我没有代表此联接表的ruby对象,因此无法执行以下操作:

ProductsVariants.find(id_array)

如何在rails迁移中删除这些条目?

3 个答案:

答案 0 :(得分:0)

你会如何从控制台进行操作?不管是什么,把它放在迁移中。例如

class Cleanup < ActiveRecord::Migration
  def up
    execute("delete from product_variants where id in (1,2,3)")
  end
  def down
  end
end

答案 1 :(得分:0)

您可以在迁移过程中为此表创建AR类,并将其用于删除记录。

答案 2 :(得分:0)

除了像maxd's的答案这样的解决方案之外,您还可以通过简单的SQL删除它们。如果您已经拥有ID列表,则可以执行以下操作:

ActiveRecord::Base.connection.execute("DELETE FROM products_variants WHERE id IN (...)")

其中...是要删除的ID列表。

半无意义的旁注:从技术上讲,数据操作通常不会出于各种原因在迁移中完成;其中一个原因是您通常不一定能保证所有(甚至任何)迁移将由您的同事(在这里非常普遍地说),或者在新的本地项目设置(意思是,您&#39)中运行。 ;我只是下拉了项目代码,并在第一时间在本地设置)。

虽然在你的场景中听起来不是这个问题,但是如果你想以Rails-y的方式做到这一点,一种替代方法是将其置于Rake任务中,以便你或其他人可以根据需要执行它,而不是依赖于迁移。