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