Используя сборки с еще одной ассоциации в Rails


в этом примере я создаю user С profile, а затем создать profile для этого пользователя. Я пытался построить с has_one ассоциация, но это взорвалось. Единственный способ, которым я вижу эту работу, - это использовать has_many. Элемент user предполагается, что только один profile.

я пробовал это. У меня есть:

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

но когда я делаю:

user.build_profile 

я получаю сообщение об ошибке:

ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4)  LIMIT 1

есть ли способ в рельсы, чтобы иметь 0 или ассоциации 1?

4 129

4 ответа:

The build подпись метода отличается для has_one и has_many ассоциации.

class User < ActiveRecord::Base
  has_one :profile
  has_many :messages
end

синтаксис сборки для

внимательно посмотрите на сообщение об ошибке. Это говорит вам, что у вас нет необходимого столбца user_id на программа. Установка связей в модели-это только часть ответа.

вам также нужно создать миграцию, которая добавляет user_id столбец в таблице профилей. Rails ожидает, что это будет там, и если это не так, вы не можете получить доступ к профилю.

для получения дополнительной информации, пожалуйста, взгляните на это ссылка:

Основы Ассоциации

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

old_profile = instance_method(:profile)
define_method(:profile) do
  old_profile.bind(self).call || build_profile
end

теперь называет #profile метод либо вернет связанный профиль, либо построит новый экземпляр.

источник: когда обезьяна ямочный метод, вы можете вызвать переопределенный метод из новой реализации?

должно быть has_one. Если build не работает, вы можете просто использовать new:

ModelName.new( :owner => @owner )

это то же самое, что

@owner.model_names.build