В этом примере я создаю объект 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 ассоциацию?
Ответы:
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
ассоциации для более подробной информации.источник
user.build_profile
для редактирования,user.build_profile if user.profile.nil?
и если вы хотите создать профиль при создании пользователя, напишитеaccepts_nested_attributes_for :profile
это в Модель пользователя. и в форме, в которой создается пользователь, напишите<%= f.simple_fields_for :profile do |p| %>
это и продолжайте.build_<association>
) - довольно странное и неожиданное поведение в Rails, гораздо больше людей ищут этот ответ, чем фактический ответ на вопросы, если вы понимаете, о чем я.Внимательно посмотрите на сообщение об ошибке. Это означает, что у вас нет обязательного столбца
user_id
в таблице профиля . Установление отношений в модели - это только часть ответа.Вам также необходимо создать миграцию, которая добавляет
user_id
столбец в таблицу профиля. Rails ожидает, что это будет, и если это не так, вы не сможете получить доступ к профилю.Для получения дополнительной информации перейдите по этой ссылке:
Основы ассоциации
источник
rails g model profile user:references:index address:string bio:text
.В зависимости от варианта использования может быть удобно обернуть метод и автоматически построить ассоциацию, если она не найдена.
old_profile = instance_method(:profile) define_method(:profile) do old_profile.bind(self).call || build_profile end
теперь вызов
#profile
метода либо вернет связанный профиль, либо создаст новый экземпляр.источник: Можете ли вы вызвать переопределенный метод из новой реализации, когда обезьяна исправляет метод?
источник
def profile; super || build_profile; end
.Это должен быть файл
has_one
. Еслиbuild
не работает, вы можете просто использоватьnew
:ModelName.new( :owner => @owner )
такой же как
@owner.model_names.build
источник