як генерувати міграцію, щоб зробити посилання поліморфними


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

і це все ще не працює


Не відповідь, але щоб уникнути плутанини, ви впевнені, що хочете цей стовпець у Продуктах? У керівництві рейками навіть є приклад продуктів, і стовпець розміщений на малюнках guides.rubyonrails.org/…
atomkirk

Відповіді:


109

Наскільки мені відомо, немає вбудованого генератора для поліморфних асоціацій. Створіть порожню міграцію та змініть її вручну відповідно до ваших потреб.

Оновлення : Вам потрібно буде вказати, яку таблицю ви змінюєте. Відповідно до цієї відповіді ТА :

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 ( додаткові відомості мають в Посібниках по рейках ).
Мішель Тіллі

2
Як додати індекс до referencesстовпця? Чи потрібно мені це індексувати?
mrudult

@mrudult Якщо я не помиляюся, вам потрібно додати їх самі, якщо вони вам потрібні. Ви можете просто додати індекси як звичайні у файлі міграції до imageable_typeта / або imageable_idза необхідності.
Мішель Тіллі

2
Так. додавання індексу imageable_idі imageable_typeпрацював. Спасибі за вашу допомогу.
mrudult

266

Те, що ви намагаєтеся зробити, ще не реалізовано в стабільній версії рейок, тому відповідь Мішель на сьогодні є правильною. Але ця функція буде реалізована в рейках 4 і вже доступна в крайовій версії наступним чином (відповідно до цього КАНАЛОГУ ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
Спробував це 4.2, і я не впевнений, що це помилка, zsh чи щось інше, але командний рядок інтерпретувався як серія посилань (як типів) з кожною літерою поліморфної форми, наприклад: t.referencesp: imagable , treferenceso: уявний тощо.
OzBarry

10
@OzBarry, в zsh вам потрібно буде уникнути дужок: $ rails генерує міграцію AddImageableToProducts imageable: reference \ {polymorphic \}
chad_

4
Для когось цікавого, це генерує міграцію методом змін, що містить:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
Якщо ви намагаєтесь використовувати те ж саме в ешафот, це працює і з ешафотом. Дякую! rijks
sghosh968

2
{polymorphic}потрібно уникати разом з рибною оболонкою, наприклад\{polymorphic\}
Доріан

36

Ви також можете зробити наступне:

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

16

Ви можете спробувати rails generate migration AddImageableToProducts imageable:references{polymorphic}


3
{і }потрібно врятуватися разом із шкаралупою риби, наприклад\{polymorphic\}
Доріан

1
Ось посилання на документацію про це: edgeguides.rubyonrails.org/…
Джованні Бенуссі

Дякую Джованні, це дуже корисно.
hutusi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.