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

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

person Mark    schedule 14.11.2011    source источник


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

    Or

    rails generate model city name:string description:string url:string organization_id:integer
    
person Feech    schedule 14.11.2011
comment
Просто для понимания. Я не могу просто отредактировать файл db/migrate/...create_cities.rb, а затем запустить rake db:migrate? Мне нужно создать новую миграцию? (В случае, если я забыл смоделировать ассоциацию во время генерации?) Должен ли я менять оба конца? Организация и город? - person Mark; 14.11.2011
comment
@Mark Нет, вы не можете, если миграция уже применена. Создайте новую миграцию и используйте метод change_table, чтобы добавить столбец ассоциации в таблицу organisations. - person Benoit Garret; 14.11.2011
comment
Вам нужно только отредактировать одну из таблиц. То есть таблица, соответствующая модель которой определяет ассоциацию belongs_to. - person Feech; 14.11.2011
comment
Кроме того, убедитесь, что в вашей БД установлены ограничения внешнего ключа. Проще всего это сделать с помощью гема Foreigner. - person Marnen Laibow-Koser; 14.11.2011