Ruby on Rails и ассоциации баз данных - PullRequest
2 голосов
/ 16 мая 2010

Я новичок в мире Ruby, и для меня есть нечто неясное в определении ассоциаций между моделями. Вопрос: где сохраняется ассоциация?

Например, если я создаю модель Customer, выполнив:

generate model Customer name:string age:integer

и затем я создаю модель заказа

generate model Order description:text quantity:integer

и затем я устанавливаю связь следующим образом:

class Customer < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
  belongs_to :customer
end

Я думаю, здесь что-то не хватает, например, внешний ключ между двумя объектами. Как он обрабатывает ассоциации, созданные с ключевыми словами "has_many" и "assign_to"?

Спасибо

Ответы [ 2 ]

3 голосов
/ 16 мая 2010

Всякий раз, когда вы генерируете свой заказ, вы можете сделать:

generate model Order description:text quantity:integer customer:references

И он автоматически создаст для вас внешний ключ в процессе миграции. Соглашение rails состоит в том, что каждая строка будет иметь первичный ключ с именем «id», а внешний ключ - это таблица, на которую она ссылается, за которой следует подчеркивание, а затем id. Так что в этом случае таблица заказов будет иметь атрибут с именем customer_id

Поскольку вы уже сгенерировали свой, вы должны создать новый сценарий миграции, который добавляет в таблицу заказов целочисленный столбец с именем customer_id.

Вы не хотите изменить существующую миграцию. Просто создайте новый, который добавляет столбец.

class add_customer_id_to_orders < ActiveRecord::Migration
  def self.up
    add_column :orders, :customer_id, :integer
  end

  def self.down
    remove_column :orders, :customer_id
  end
end

Примечание. Если вы уже что-то сделали для создания данных в своей базе данных, это приведет к появлению некоторых нулевых внешних ключей, которые вы захотите исправить, или просто удалите и создайте новые данные.

1 голос
/ 16 мая 2010

Вы должны добавить (целочисленный) столбец в таблицу заказов, который называется 'customer_id'.

...