Подтвердить что ты не робот

Как создавать ассоциации между моделями

Мне интересно, как правильно выполнить связь в 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
4b9b3361

Ответ 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