gpt4 book ai didi

ruby-on-rails - Factory_girl 与 validates_presence_of 有_one 关系

转载 作者:行者123 更新时间:2023-11-28 19:44:08 25 4
gpt4 key购买 nike

我有 2 个模型:

# user.rb
class User < ActiveRecord::Base
has_one :profile, :dependent => :destroy
end

# profile.rb
class Profile < ActiveRecord::Base
belongs_to :user
validates_presence_of :user
end

# user_factory.rb
Factory.define :user do |u|
u.login "test"
u.association :profile
end

我想这样做:

@user = Factory(:user)
=> #<User id: 88,....>
@user.profile
=> #<Profile id:123, user_id:88, ......>

@user = Factory.build(:user)
=> #<User id: nil,....>
@user.profile
=> #<Profile id:nil, user_id:nil, ......>

但这行不通!它告诉我我的配置文件模型不正确,因为没有用户! (它在用户之前保存配置文件,所以没有user_id ...)

我该如何解决这个问题?什么都试过了.. :(我需要调用 Factory.create(:user)...

更新

解决了这个问题 - 现在可以使用:

# user_factory.rb
Factory.define :user do |u|
u.profile { Factory.build(:profile)}
end

# user.rb
class User < ActiveRecord::Base
has_one :profile, :dependent => :destroy, :inverse_of => :user
end

# profile.rb
class Profile < ActiveRecord::Base
belongs_to :user
validates_presence_of :user
end

最佳答案

以这种方式修复它 ( as explained in this post )

Factory.define :user do |u|
u.login "test"
u.profile { |p| p.association(:profile) }
end

您还可以做的(因为用户不需要配置文件存在(没有验证))是进行两步构建

Factory.define :user do |u|
u.login "test"
end

然后

profile = Factory :profile
user = Factory :user, :profile => profile

我想在那种情况下你甚至只需要一步,在配置文件工厂中创建用户并执行

profile = Factory :profile
@user = profile.user

这似乎是正确的做法,不是吗?

更新

(根据您的评论)为避免保存配置文件,请使用 Factory.build 仅构建它。

Factory.define :user do |u|
u.login "test"
u.after_build { |a| Factory(:profile, :user => a)}
end

关于ruby-on-rails - Factory_girl 与 validates_presence_of 有_one 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3648699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com