迁移时是否需要对belongs_to / has_many关系使用add_index? (Rails 3.2,Active Record)

时间:2013-09-07 12:16:10

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我的问题很简单,但我没有找到明确的答案。

我建立了每日优惠Rails应用。

  • 每笔交易都有很多产品(has_many)

  • 每件商品都属于交易

Rails Guides获取2.3,我将在我的迁移中使用它:

   class CreateDeal < ActiveRecord::Migration
    def change
      create_table :deals do |t|
        t.string :name
        t.timestamps
      end

      create_table :products do |t|
        t.belongs_to :Deal
        t.timestamps
      end
    end
   end

自动,Rails /活动记录会在产品表中添加一列deal_id吗?

我是否需要通过添加到我的迁移add_index手动(例如下面)在此deals_id列上添加索引,或者是否因为我设置的belongs_to / has_many关系而“自动”完成?

create_table :products do |t|
  t.belongs_to :Deal
  t.timestamps

  add_index :products, :deals_id 
end

3 个答案:

答案 0 :(得分:13)

您需要自己添加索引...但是,如果您对模型使用命令行生成器并使用belongs_to,则Rails会将索引添加到迁移中...

e.g。

rails g model product deal:belongs_to

会产生

class CreateProducts < ActiveRecord::Migration
  def change
    create table :products do |t|
      t.belongs_to :deal

      t.timestamps
    end
    add_index :products, :deal_id
  end
end

答案 1 :(得分:2)

您需要自己添加索引。

此外,您的迁移不太正确,您需要第3个表格,即:

class CreateDeal < ActiveRecord::Migration
  def change
    create_table :deals do |t|
      t.string :name
      t.timestamps
    end

    create_table :products do |t|
      t.string :title
      t.timestamps
    end

    create_table :deals_products do |t|
      t.belongs_to :deal
      t.belongs_to :product
    end
  end
end

根据http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

答案 2 :(得分:1)

Mathieu,在有这样疑问的情况下,你不确定是否正在创建某些东西:最好只是明确地创建你认为需要的东西(在这种情况下是索引),看看会发生什么当您运行迁移时。

这背后的逻辑是,如果您的:deal_id列已经编入索引并且您的迁移尝试重新编制索引,则会出现错误并且迁移将回滚以便您可以修复它。但是,如果您未在迁移中添加索引,则显然不会出现任何错误,但您必须采取额外步骤来检查索引是否存在。

class CreateDeal < ActiveRecord::Migration
  def change
    create_table :deals do |t|
      t.string :name
      t.timestamps
    end

    create_table :products do |t|
      t.belongs_to :Deal
      t.timestamps
    end

    add_index :products, :deal_id
  end
end

请注意,您还希望在表创建过程完成后添加索引。在create_table帮助程序中使用add_index帮助程序可能会导致错误。