在rails中使用has_one关联构build

在这个例子中,我创build了一个没有profileuser ,然后为这个用户创build一个profile 。 我尝试使用has_one关联构build,但是被炸毁了。 我看到这个工作的唯一方法是使用has_manyuser应该只有最多一个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协会的方式吗?

has_onehas_many关联的build方法签名是不同的。

 class User < ActiveRecord::Base has_one :profile has_many :messages end 

has_many关联的构build语法:

 user.messages.build 

has_one关联的构build语法:

 user.build_profile # this will work user.profile.build # this will throw error 

阅读has_one关联文档以获取更多详细信息。

仔细看看错误消息。 它告诉你,在configuration文件表中没有所需的列user_id 。 设定模型中的关系只是答案的一部分。

您还需要创build一个将user_id列添加到configuration文件表的迁移。 Rails期望这个在那里,如果不是,你不能访问该configuration文件。

欲了解更多信息,请看看这个链接:

协会基础

根据使用情况,可以方便地包装方法并在找不到时自动build立关联。

 old_profile = instance_method(:profile) define_method(:profile) do old_profile.bind(self).call || build_profile end 

现在调用#profile方法将返回关联的configuration文件或构build一个新的实例。

来源: 当猴子修补方法,你可以从新的实施调用重写的方法?

它应该是一个has_one 。 如果build不起作用,你可以使用new

 ModelName.new( :owner => @owner ) 

是相同的

 @owner.model_names.build