Используя сборки с еще одной ассоциации в 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 ответа:
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
метод либо вернет связанный профиль, либо построит новый экземпляр.источник: когда обезьяна ямочный метод, вы можете вызвать переопределенный метод из новой реализации?