как сгенерировать миграцию, чтобы сделать ссылки полиморфными

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

и это все еще не сработало

railslearner
источник
Не ответ, но чтобы избежать путаницы, вы уверены, что хотите эту колонку «Продукты»? В руководстве по рельсам даже есть пример продуктов, а столбец находится на сайте Pictures guides.rubyonrails.org/…
atomkirk

Ответы:

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
После того, как вы запустите миграцию, он schema.rbдолжен обновиться, но ничего не скажет о polymorphic. Вместо этого вы должны увидеть фактические поля, которые использует Rails ( дополнительную информацию можно найти в руководствах по Rails ).
Мишель Тилли
2
Как добавить индекс в referencesстолбец? Мне нужно это проиндексировать?
mrudult
@mrudult Если я не ошибаюсь, вам нужно добавить их сами, если они вам нужны. Вы можете просто добавлять индексы в файл миграции как обычно imageable_typeи / или по imageable_idмере необходимости.
Мишель Тилли
2
Ага. добавление индекса imageable_idи imageable_typeработало. Спасибо за вашу помощь.
mrudult
266

То, что вы пытаетесь сделать, еще не реализовано в стабильной версии рельсов, поэтому ответ Мишель на данный момент правильный. Но эта функция будет реализована в рельсах 4 и уже доступна в версии Edge следующим образом (согласно этому ИЗМЕНЕНИЮ ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}
симон-оливье
источник
1
Пробовал это на 4.2, и я не уверен, что это ошибка, zsh или что-то еще, но командная строка интерпретировалась как серия ссылок (как типы) с каждой полиморфной буквой, например: t.referencesp: imagable , treferenceso: вообразимо и т. д.
OzBarry
10
@OzBarry, в zsh вам нужно избегать фигурных скобок: $ rails генерирует миграцию AddImageableToProducts imageable: links \ {polymorphic \}
chad_ 01
4
Для всех, кому интересно, это генерирует миграцию с методом изменения, содержащую:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel
1
Если кто-то пытается использовать то же самое в эшафоте, это работает и с эшафотом. Спасибо! rijks
sghosh968 06
2
{polymorphic}нужно \{polymorphic\}
Дориан
36

Вы также можете сделать следующее:

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end
freddyrangel
источник
16

Можешь попробовать rails generate migration AddImageableToProducts imageable:references{polymorphic}

hutusi
источник
3
{и }нужно \{polymorphic\}
Дориан
1
Вот ссылка на документацию по этому поводу: edgeguides.rubyonrails.org/…
Джованни Бенусси
Спасибо, Джованни, это очень полезно.
hutusi 05