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


Мне интересно, как это сделать ассоциации на правильные рельсы. Сначала я создаю модель города и организацию. Теперь я хочу, чтобы у организации был город... это делается путем добавления ассоциаций has_many и has_one. После этого я бегу rake db:migrate. Но почему-то он не создает поля city или city_id в моей модели базы данных. Должен ли я сделать это сам? Разве rails не должен теперь создать ограничение внешнего ключа в базе данных?

Чтобы посмотреть, сработало ли это, я использую rails c и набираю Organisation ответ таков:

=> Organisation(id: integer, name: string, description: string, url: string, created_at: datetime, updated_at: datetime) 
Пожалуйста, простите мой глупый вопрос... Я новичок в рельсах, и все еще очень незнакомо.

Спасибо!


Город:

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 19

1 ответ:

В этом есть пара неправильных вещей.

  1. Вам нужно указать belongs_to на другой стороне ассоциации has_many или has_one. Модель, определяющая ассоциацию belongs_to, находится там, где принадлежит внешний ключ.

    Таким образом, если организация has_one :city, то город должен belongs_to :organization. В качестве альтернативы, если город has_one :organization, то организация должна belongs_to :city.

    Глядя на вашу настройку, похоже, что вы хотите, чтобы определение belongs_to было внутри City модель.

  2. Миграции не строятся на основе определений модели. Вместо этого они создаются из папки 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