我可以批量创建带有父模型和子模型的新ActiveRecord模型吗?

时间:2019-02-13 06:22:09

标签: ruby-on-rails ruby sqlite activerecord

我想通过一种方法创建一些ActiveRecord模型。

我的记录在下面。

class Company < ApplicationRecord
  has_many :users
  has_many :teams
  has_many :participations
end

class User < ApplicationRecord
  belongs_to :company
  has_many :participations
  has_many :teams, through: :participations
end

class Team < ApplicationRecord
  belongs_to :company
  has_many :participations
  has_many :users, through: :participations
end

class Participation < ApplicationRecord
  belongs_to :company
  belongs_to :user
  belongs_to :team
end

我的环境。

$ ruby -v
ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-darwin17]
$ rails -v
Rails 5.0.7.1

我尝试过了。但是出现了错误。

u = User.create(
  company: Company.create,
  teams: [
    Team.create(company: Company.create)
  ]
)
irb(main):021:0* u.errors
=> #<ActiveModel::Errors:0x00007faf7f5668b0 @base=#<User id: nil, company_id: 25, name: nil, created_at: nil, updated_at: nil>, @messages={:participations=>["is invalid"]}, @details={:participations=>[{:error=>:invalid}]}>
irb(main):022:0> u.participations
=> #<ActiveRecord::Associations::CollectionProxy [#<Participation id: nil, company_id: nil, user_id: nil, team_id: 15, created_at: nil, updated_at: nil>]>

我可以创建一个记录吗?还是不能??

1 个答案:

答案 0 :(得分:0)

您不能在一行中执行此操作。您正在尝试实例化并传递仅需要ID的整个Company对象。此外,由于尚未创建用户,因此无法将user_id附加到该公司。

您可以在一个方法内完成所有这些操作,但是出于多种原因,这可能不是一个好主意。我建议将您的逻辑分解为易于测试和维护的多种方法。