我的问题很简单,但我没有找到明确的答案。
我建立了每日优惠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
答案 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帮助程序可能会导致错误。