【问题标题】:Rails migration delete rowRails 迁移删除行
【发布时间】:2015-10-07 17:36:37
【问题描述】:

我正在尝试运行迁移以删除数据库中的两行。这是迁移文件...

class RemoveMenuItem < ActiveRecord::Migration
  def up
    MenuItem.delete(name: "Validation Settings")
    MenuItem.delete(name: "Identifier Lookup")
  end

  def down
    MenuItem.create(name: "Validation Settings", type: "MenuItem", actionable_item_id: 89, actionable_items_count: 0, sequence: 20)
    MenuItem.create(name: "Identifier Lookup", type: "MenuItem", actionable_item_id: 89, actionable_items_count: 0, sequence: 30)
  end
end

...但我收到此错误...

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "id"
LINE 1: ...ERE "actionable_items"."type" IN ('MenuItem') AND "id"."name...
                                                             ^
: DELETE FROM "actionable_items" WHERE "actionable_items"."type" IN ('MenuItem') AND "id"."name" = 'Validation Settings'/Users/kweihe/.rvm/gems/ruby-2.1.6/gems/activerecord-3.2.22/lib/active_record/connection_adapters/postgresql_adapter.rb:1163:in `async_exec'

【问题讨论】:

  • 迁移不是用来修改数据库架构的吗?你实际上是在处理数据库数据。为此,我认为您应该使用架构文件!

标签: ruby-on-rails ruby-on-rails-3 migration delete-row migrate


【解决方案1】:

解决方案

class RemoveActionableItems < ActiveRecord::Migration
  class ActionableItem < ActiveRecord::Base
    attr_accessible :actionable_item, :name, :sequence, :type
  end
  def up
    validation_settings = MenuItem.find_by_name("Validation Settings")
    identifier_lookup = MenuItem.find_by_name("Identifier Lookup")
    compliance = InsightReportMenuItem.find_by_name("Compliance")
    validation_settings.delete unless validation_settings.nil?
    identifier_lookup.delete unless identifier_lookup.nil?
    compliance.delete unless compliance.nil?
  end

  def down
    MenuItem.create :name => "Validation Settings", :type => "MenuItem"
    MenuItem.create :name => "Identifier Lookup", :type => "MenuItem"
    InsightReportMenuItem.create :name => "Compliance", :type => "InsightReportMenuItem"
  end
end

【讨论】:

    【解决方案2】:

    删除需要确定的记录才能工作。试试这个:

     def up
          MenuItem.find_by(name: "Validation Settings").delete
          ....
    

    我同意评论者的观点 - 这似乎不是您在迁移中一定想要的东西。在种子文件中可能更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2011-10-29
      相关资源
      最近更新 更多