如何生成迁移以使引用多态


121

我有一个产品表,想添加一列:

t.references :imageable, :polymorphic => true

我正在尝试通过执行以下操作来生成迁移:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

但我显然做错了。有人可以提出任何建议吗?谢谢

当我尝试在生成迁移后手动将其放入时,我这样做是这样的:

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :imageable, :references, :polymorphic => true
  end

  def self.down
    remove_column :products, :imageable
  end
end

而且仍然没有用


不是答案,而是为了避免混淆,您确定要在产品上使用此列吗?rails指南甚至有一个Products示例,该列在Picturesguides.rubyonrails.org/…上–atomkirk
2015年

Answers:


109

据我所知,没有内置的多态关联生成器。生成空白迁移,然后根据需要手动进行修改。

更新:您需要指定要更改的表。根据这个SO答案

class AddImageableToProducts < ActiveRecord::Migration
  def up
    change_table :products do |t|
      t.references :imageable, polymorphic: true
    end
  end

  def down
    change_table :products do |t|
      t.remove_references :imageable, polymorphic: true
    end
  end
end

非常感谢布兰登。我能够运行迁移。我想知道的是,在使:polymorphic => true并打开schema.rb之后,是否也应该在模式中看到它?
railslearner 2011年

运行迁移后,schema.rb应进行更新,但不会透露任何信息polymorphic。相反,您应该看到Rails使用的实际字段(Rails指南中有更多信息)。
Michelle Tilley

2
如何将索引添加到references列?我需要索引吗?
mrudult

@mrudult如果我没记错的话,如果需要,您确实需要自己添加。您可以只在迁移文件中正常添加索引imageable_type和/或imageable_id根据需要添加索引。
米歇尔·提里2014年

2
对。添加索引imageable_idimageable_type起作用。谢谢你的帮助。
mrudult

266

您正在尝试做的事情尚未在稳定版本的rails中实现,因此Michelle的答案现在是正确的答案。但是此功能将在rails 4中实现,并且已在以下边缘版本中提供(根据此CHANGELOG):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
在4.2上进行了尝试,我不确定这是Bug,zsh还是其他东西,但是命令行被解释为一系列带有多态字母的引用(作为类型),例如:t.referencesp:imagable ,treferenceso:
imagable

10
@OzBarry,在zsh中,您需要转括号:$ rails生成迁移AddImageableToProducts imageable:references \ {polymorphic \}
chad_

4
对于任何好奇的人,这都会生成包含以下更改方法的迁移:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel,2016年

1
如果有人尝试在脚手架中使用相同的支架,那么这也适用于脚手架。谢谢!列克斯
sghosh968

2
{polymorphic}需要用鱼壳逃脱,例如\{polymorphic\}
Dorian

36

您还可以执行以下操作:

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.