has_many 通过不可见的验证?

has_many through invisible validations?

我有一个设置,我希望能够在其中建立角色记录以指向用户技能、场地、作品、小组等。

我将其设置为与所有事物都有许多直通关系,角色和角色属于所有事物,如下所示:

class Role < ApplicationRecord
  belongs_to :user
  belongs_to :skill
  belongs_to :production
  belongs_to :venue
  belongs_to :project
  belongs_to :group
end

并将个人角色类别设置为:

class Group < ApplicationRecord
  has_many :users, through: :roles
end

除了用户之外,其他都是一样的,这当然对模型有很多细节。

每个 table 都有一个名称字段、一个 ID 字段和标准时间戳字段。

我将其设置为索引每个 table 的名称。

当我尝试仅使用 role_id、user_id 和 skill_id 构建记录角色时,我在控制台中收到错误消息,提示我需要所有值。

这是否意味着我必须通过关系为每种类型的角色建立一个 has_many 和它自己的 "through"?或者 has_many 到 table 可以按照我设想的方式工作吗?为什么要尝试验证每个字段的数据是否存在?会不会是因为索引?

如果我想关闭该验证,我什至不确定将代码放在哪里,因为我不确定验证来自何处。

Rails 5 belongs_to 的默认行为是父关联必须存在,所以是的,您需要所有字段才能保存角色。

但是,要关闭此行为,请更改为:

# config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = false
# this would disable this configuration for the entire application

更新

另一种方法是找出最重要的关联并确保这些关联可用,并在可选关联上设置可选标签,如下所示:

class Role < ApplicationRecord
  belongs_to :user
  belongs_to :skill, optional: true # assume skill & production are optional
  belongs_to :production, optional: true
  belongs_to :venue
  belongs_to :project
  belongs_to :group
end