我有一个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

有什么简单的方法可以绕过这个问题吗?

推荐答案

Active Record supports automatic identification for most associations with standard names. However, Active Record will not automatically identify bi-directional associations that contain the :through or :foreign_key options.(可以勾选here)

所以你必须明确地定义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

Ruby-on-rails相关问答推荐

Ruby/Rails 相当于 Python 的 sys.addAuditHook

API Rails 路由,令牌是路由的一部分

Rails 7.0.4 和 link_to 的数据确认不起作用

在 Rails 7 中,可以将导入映射与 js Bundle 解决方案一起使用,还是它们是专有的?

Ruby on rails 查询不知道怎么写

Ruby 地理定位Ruby /插件

在 Rails 3.2 中更新多行

设计:手动加密密码并直接存储

在 Rails 中,如何处理多个选中的复选框,只需拆分 , 或?

rails 4.0, rake db:sessions:create

是否可以在 Rails 集成测试或规范中指定用户代理?

为什么我要使用 unicorn 或 thin 而不是 WEBrick 用于开发目的?

在 Rails 中创建随机 DateTime 的最佳方法

未捕获的类型错误:未定义不是函数- 初学者 Backbone.js 应用程序

嵌套模型和父验证

如何使用 Rspec 判断 ActiveJob 中排队的内容

获取完整的 rails 控制器名称,包括命名空间

Coffeescript ||= 模拟?

ActiveModel::MissingAttributeError:无法使用 FactoryGirl 写入未知属性ad_id

没有UTC的Rails 3默认日期时间格式