ruby-on-rails 所有关联都未构建

biswetbf  于 2023-04-22  发布在  Ruby
关注(0)|答案(2)|浏览(99)

这是Rails 7中的一个bug吗?

# user.rb
has_one :company
has_many :foos

# company.rb
belongs_to :user
has_many :foos

# foo.rb
belongs_to :user
belongs_to :company

当我这样做:

User.first.company.foos.build
# => id: nil, user_id: nil, company_id: 1, ...

为什么user_idnil
这是一个控制器。我必须使用.tap.merge

User.first.company.foos.build(foo_params.merge({ user_id: 1 })

或者:

User.first.company.foos.build(foo_params.tap { |par| par[:user_id] = 1 })

我希望build同时使用模型的primary_key填充user_idcompany_id

vohkndzv

vohkndzv1#

为什么user_idnil?
因为当你调用User.first.company.foos.build
它首先运行User.first
例如:#<User id: 1, company_id: 1, ...相当于:

user = User.first
user.company.foos.build

接下来,它让上面的用户继续运行:公司简介
相当于:

company = user.company # or company  = Company.find_by(user_id: 1)
company.foos.build

最后我想说什么

User.first.company.foos.build等于company.foos.build
if User.first.foos.build =〉user_id not nil
if Company.first.foos.build =〉company_id not nil
在本例中=〉foos是从company构建
那你错在哪里
user.rb中的冗余has_many :foos
因为用户has_one :company和公司has_many :foos =〉当然是用户has_many :foos

溶液

删除user.rb中的has_many :foos和foo.rb中的belongs_to :user

b4lqfgs4

b4lqfgs42#

我使用了领域驱动设计方法:

# company.rb
belongs_to :user
has_many :foos

def build_foos(args = {})
 foos.build({user_id: user_id}.merge(args))
end

在控制器中:

User.first.company.build_foos

# or

User.first.company.build_foos(params)

相关问题