ruby-on-rails 创建带有“has_many_through”关联的记录- Ruby on Rails

zpjtge22  于 2023-06-07  发布在  Ruby
关注(0)|答案(3)|浏览(243)

我有一个has_many_through关联,其中User有许多ProjectProjectUser。Rails有一些魔力,允许更新这种关系:

u = User.first
u.update(project_ids: [...])

有没有一种简单的方法可以对create做同样的事情?
运行User.create(name: ..., project_ids: [...])失败,并显示Validation failed: Project users is invalid
我怀疑这是因为Rails试图在创建User记录之前创建ProjectUser记录,并且在连接表上有一些内置的验证,以验证连接的两端都已经存在。ProjectUser模型没有自定义验证。

class ProjectUser < ApplicationRecord
  belongs_to :project
  belongs_to :user
end

有没有一个简单的方法来解决这个问题?

0vvn1miw

0vvn1miw1#

  • 活动记录支持自动识别大多数具有标准名称的关联。但是,活动记录不会自动识别包含:through或:foreign_key选项的双向关联。*(您可以在此处检查)

所以你必须明确定义inverse_of

class Project < ApplicationRecord
  has_many :project_users, foreign_key: :project_id, inverse_of: :project
  has_many :users, through: :project_users
end

class User < ApplicationRecord
  has_many :project_users, foreign_key: :user_id, inverse_of: :user
  has_many :projects, through: :project_users
end

class ProjectUser < ApplicationRecord
  belongs_to :project
  belongs_to :user
end
axzmvihb

axzmvihb2#

通常人们使用hmt(而不是has_and_belongs_to_many),因为他们有其他的字段,他们有兴趣在连接表中填充,因此人们通常使用连接表创建模型记录的三元组,例如。

ProjectUser.create! the_extra_field: "Foo", user: User.create!(name: "Jim"), project: Project.create!(title: "Project X")

显然,如果您已经有了一个现有的UserProject,那么您应该使用它们,而不是创建新的。

2w3kk1z5

2w3kk1z53#

我认为您需要使用accepts_nested_attributes_for

class User < ApplicationRecord
  has_many :project_users
  has_many :projects, through: :project_users

  accepts_nested_attributes_for :projects
end

这一定会帮助您创建与您所期望的项目相关联的用户

User.create(name: 'John', project_ids: [...])

相关问题