Как создать ассоциации между моделями - PullRequest
20 голосов
/ 14 ноября 2011

Мне интересно, как правильно сделать ассоциацию в 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 Ответ

19 голосов
/ 14 ноября 2011

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

  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
    
...