В этом примере я создаю a user
без profile
, затем позже создайте a profile
для того пользователя. Я пытался использовать сборку с a 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 ассоциацию?
Сигнатура метода build
отличается для ассоциаций has_one
и has_many
.
class User < ActiveRecord::Base
has_one :profile
has_many :messages
end
Синтаксис сборки для ассоциации has_many
:
user.messages.build
Синтаксис сборки для ассоциации has_one
:
user.build_profile # this will work
user.profile.build # this will throw error
Прочтите документацию по ассоциации has_one
для более подробной информации.
Это должен быть has_one
. Если build
не работает, вы можете просто использовать new
:
ModelName.new( :owner => @owner )
то же самое, что
@owner.model_names.build
Внимательно посмотрите на сообщение об ошибке. Он сообщает вам, что у вас нет обязательного столбца user_id
в таблице профиля .
Установка отношений в модели - это только часть ответа.
Вам также необходимо создать миграцию, которая добавит столбец user_id
в таблицу профиля.
Rails ожидает, что это будет, и если это не так, вы не сможете получить доступ к профилю.
Для получения дополнительной информации перейдите по этой ссылке: