Как создавать ассоциации между моделями
Мне интересно, как правильно выполнить связь в Rails. Сначала я создаю модель города и организацию. Теперь я хочу, чтобы у Организации был город... это делается путем добавления ассоциаций has_many
и has_one
. После этого я запустил rake db:migrate
. Но почему-то это не создает поле city
или city_id
в моей модели базы данных. Должен ли я сам это делать? Должны ли теперь рельсы создавать ограничение внешнего ключа в базе данных?
Чтобы узнать, работает ли он, я использую rails c
и введите Organisation
ответ следующий:
=> Organisation(id: integer, name: string, description: string, url: string, created_at: datetime, updated_at: datetime)
Пожалуйста, извините мой глупый вопрос... Я новичок в Rails, и все по-прежнему очень незнакомо.
Спасибо!
Город:
class City < ActiveRecord::Base
has_many :organisations
end
Организация:
class Organisation < ActiveRecord::Base
has_one :city
end
Создать город:
class CreateCities < ActiveRecord::Migration
def change
create_table :cities do |t|
t.string :name
t.string :country
t.timestamps
end
end
end
Создать организацию:
class CreateOrganisations < ActiveRecord::Migration
def change
create_table :organisations do |t|
t.string :name
t.string :description
t.string :url
t.timestamps
end
end
end
Ответы
Ответ 1
В этом есть пара ошибок.
-
Вам нужно указать belongs_to
на другой стороне ассоциации has_many
или has_one
. Модель, определяющая ассоциацию belongs_to
, относится к внешнему ключу.
Итак, если Организация has_one :city
, тогда Город должен belongs_to :organization
. В качестве альтернативы, если City has_one :organization
, то Организация должна belongs_to :city
.
Глядя на вашу настройку, похоже, что вы хотите определение belongs_to
внутри модели City
.
-
Миграции не основаны на определениях модели. Вместо этого они создаются из папки db/migrations
. Миграция создается при запуске команды rails g model
(или rails g migration
). Чтобы получить внешний ключ, вам нужно сообщить генератору, чтобы он его создал.
rails generate model organization name:string description:string url:string city_id:integer
или
rails generate model city name:string description:string url:string organization_id:integer