在此示例中,我创建了一个没有user
的{{1}},然后为该用户创建了一个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
rails中有一种方法可以有0或1个关联吗?
答案 0 :(得分:347)
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
协会documentation了解详情。
答案 1 :(得分:17)
仔细查看错误消息。它告诉您,个人资料表中没有必填列user_id
。
在模型中设置关系只是答案的一部分。
您还需要创建一个迁移,将user_id
列添加到配置文件表中。
Rails希望它存在,如果不存在,则无法访问配置文件。
有关详细信息,请查看此链接:
答案 2 :(得分:0)
根据用例的不同,可以方便地包装方法,并在找不到时自动建立关联。
old_profile = instance_method(:profile)
define_method(:profile) do
old_profile.bind(self).call || build_profile
end
现在调用#profile
方法将返回关联的配置文件或构建新实例。
源: When monkey patching a method, can you call the overridden method from the new implementation?
答案 3 :(得分:-13)
它应该是has_one
。如果build
无效,您可以使用new
:
ModelName.new( :owner => @owner )
与
相同@owner.model_names.build