【问题标题】:add index ruby in rails 4.1.4 migration在 Rails 4.1.4 迁移中添加索引 ruby
【发布时间】:2014-09-04 00:34:59
【问题描述】:

我在 RoR 中创建一个项目,运行“rake db:migrate”时出错:

Mysql2::Error: Key column 'item_id' doesn't exist in table

而且我不明白我做错了什么:

这是我的物品迁移

class CreateMerchants < ActiveRecord::Migration
   def change
       create_table :merchants do |t|
           t.string     :name,      null: false, limit: 100
           t.string     :address,   null: false, limit: 200

           t.timestamps
       end
   end
 end

还有我的购买迁移:

class CreatePurchases < ActiveRecord::Migration
  def change
    create_table :purchases do |t|
        t.references    :purchasers,        null: false
        t.references    :items,             null: false
        t.references    :merchants,         null: false
        t.decimal       :purchase_count,    null: false, precision: 17, scale: 2

        t.timestamps
    end

    add_index       :purchases,     :item_id
    add_index       :purchases,     :merchant_id
    add_index       :purchases,     :purchaser_id
  end
end

谁能告诉我哪里错了?

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-4.1


    【解决方案1】:

    问题是引用需要一个单数名称,您也可以在创建引用的同一行中创建索引,因此您的迁移应该如下所示:

    class CreatePurchases < ActiveRecord::Migration
      def change
        create_table :purchases do |t|
            t.references    :purchaser,        null: false, index: true
            t.references    :item,             null: false, index: true
            t.references    :merchant,         null: false, index: true
            t.decimal       :purchase_count,   null: false, precision: 17, scale: 2
    
            t.timestamps
        end
      end
    end
    

    【讨论】:

    • 它有效,但仅用于教育目的,在这种情况下我的 add_index 应该如何?在同一行或使用 add_index 创建更合适?
    • 就像您在问题中添加的那样:add_index :purchases, item_id 问题在于,例如,使用 t.references :items 会生成一个名为 items_id 而不是 item_id 的字段
    【解决方案2】:

    试试这个:

    class CreatePurchases < ActiveRecord::Migration
      def change
        create_table :purchases do |t|
            t.integer    :purchaser_id,        null: false
            t.integer    :item_id,             null: false
            t.integer    :merchant_id,         null: false
            t.decimal    :purchase_count,      null: false, precision: 17, scale: 2
    
            t.timestamps
        end
    
        add_index       :purchases,     :item_id
        add_index       :purchases,     :merchant_id
        add_index       :purchases,     :purchaser_id
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 2015-03-01
      • 2017-02-17
      • 2014-05-13
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多