Почему родительская модель в ассоциации has_one имеет external_key = nil

У меня две модели:

class User < ActiveRecord::Base
  before_create :add_address
  has_one :address


  def add_address
    self.address_id ||= Address.generate_new.id
  end
end

И

class Address < ActiveRecord::Base
  belongs_to :user

  def self.generate_new
    new_address = # some code generating UUID

    Address.create!({address: new_address})
  end
end

когда я создаю User.new, он создает ассоциацию адресов, сохраняет ее, и я могу получить ее с помощью user.address, а в адресной строке mysql есть правильный user_id, но User в mysql имеет address_id = nil. Что я делаю неправильно? Я пробовал User.new\user.build_address в обоих случаях, когда он создает и сохраняет адрес, но у пользователя всегда есть address_id = nil


person user2471519    schedule 13.06.2013    source источник


Ответы (2)


Так и должно быть. Из документа по Rails

Различие заключается в том, где вы размещаете внешний ключ (он идет в таблицу для класса, объявляющего ассоциацию принадлежности_к)

Это означает, что, поскольку ваша модель Address объявляет belongs_to, именно туда следует поместить внешний ключ.

Rails делает за кулисами, когда вы ищете user.address, выполняет поиск Address, у которого есть user_id, равный текущему идентификатору user.

Что-то типа:

Select * From addresses where user_id = <current_user>.id
person Tyler DeWitt    schedule 13.06.2013

Почему у вас есть столбец address_id в пользовательской модели? Для ассоциации должно быть достаточно иметь user_id в таблице адресов.

person usha    schedule 13.06.2013