Создайте миграцию для создания таблицы, которая объединяет 3 таблицы

#ruby-on-rails #ruby-on-rails-4

#ruby-on-rails #ruby-on-rails-4

Вопрос:

У меня есть 3 таблицы, и я хочу создать новую таблицу, в которой хранится следующее:

 user_id 
project_id 
company_id
 

Я пробовал использовать эту команду, но она не работает:

 rails g migration CreateJoinTableUserProjectCompany 
    user:referencess project:referencess company:referencess
 

Что бы вы посоветовали?

Комментарии:

1. Как они связаны? Опубликуйте свои models ассоциации с помощью.

2. Вы неправильно referencess написали, что это должно быть references

3. Я пробовал следующую команду, но файл миграции генерирует пустой метод изменения rails g migration CreateJoinTableUserProjectCompany user:references project:references company:references

Ответ №1:

При создании миграции не используются параметры столбца, если вы не хотите добавить или удалить столбец в существующую модель. Вам нужно будет сгенерировать модель, чтобы выполнить то, что вы пытаетесь сделать (почти). Например:

 rails g model UserProjectCompany user:references project:references company:references
 

Это приведет к следующей миграции:

 class CreateUserProjectCompanies < ActiveRecord::Migration
  def change
    create_table :user_project_companies do |t|
      t.references :user
      t.references :project
      t.references :company

      t.timestamps
    end
    add_index :user_project_companies, :user_id
    add_index :user_project_companies, :project_id
    add_index :user_project_companies, :company_id
  end
end
 

Но учтите, что вам придется добавлять :id => false и удалять t.timestamps их, если они вам не нужны.

Другое дело, что он также сгенерирует модель с именем «UserProjectCompanies» и некоторые спецификации для нее.

Комментарии:

1. Вы можете создать миграцию, которая не просто добавляет столбцы в таблицу или удаляет столбцы из нее. Попробуйте миграцию в моем ответе, которая создает таблицу с этими тремя столбцами. Но это определенно хороший призыв создать модель для этой конкретной таблицы, которой у меня не было в моем ответе. 1 для вас!

2. Вы правы. Он генерирует миграцию со столбцами в последней версии Rails. В Rails 3 он просто создает файл с пустым change методом. Вероятно, это справедливо и для более старой версии Rails 4.

3. О, интересно. Да, я тестировал его только на Rails 4. Приятно знать!

Ответ №2:

На самом деле я не совсем уверен, как сгенерировать миграцию для создания таблицы соединений только с этими тремя столбцами и столбцом id. Очевидно, что мы можем отредактировать сгенерированную миграцию и отредактировать ее (что я сделаю в своем ответе), но что в этом интересного?

Сказав это, и, по-видимому, удалив все веселье, я предложил создать целую таблицу, включая столбец id, даже если вы, возможно, думаете, что вам это не нужно. Это может пригодиться (какой из этих двух u-p-c был создан первым, мне нужно поместить эту модель во вложенную форму и т.д.). Чтобы создать таблицу, содержащую идентификатор, вы можете просто выполнить следующую команду.

 rails g migration CreateUserProjectCompany user:references project:references company:references
 

Запуск созданной миграции приведет к созданию таблицы, которая выглядит следующим образом:

 id | user_id | project_id | company_id
 

Чтобы создать таблицу без идентификатора, вам, к сожалению, потребуется отредактировать миграцию. Замените эту строку…

 create_table :user_project_companies do |t|
 

…с этим одним.

 create_table :user_project_companies, id: false do |t|
 

Т.е. добавьте , id: false после имени таблицы, которое указывает, что в таблице не должно быть id столбца. Выполнение этой миграции даст вам таблицу, содержащую только три столбца.

 user_id | product_id | company_id
 

Ответ №3:

Эй, вы допустили ошибку опечатки, вместо этого используйте ссылки

  rails g migration CreateJoinTableUserProjectCompany user:references project:references company:references
 

Комментарии:

1. Извините, я пробовал это, но сгенерировал пустой метод изменения