#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. Извините, я пробовал это, но сгенерировал пустой метод изменения