在rails中使用带有has_one关联的构建

时间:2010-03-18 20:01:53

标签: ruby-on-rails associations has-one database-relations

在此示例中,我创建了一个没有user的{​​{1}},然后为该用户创建了一个profile。我尝试使用带有profile关联的构建,但是爆炸了。我看到这个工作的唯一方法是使用has_onehas_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个关联吗?

4 个答案:

答案 0 :(得分:347)

build方法签名与has_onehas_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希望它存在,如果不存在,则无法访问配置文件。

有关详细信息,请查看此链接:

Association Basics

答案 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