has_many通过隐形验证?

时间:2016-07-28 23:55:55

标签: ruby-on-rails validation has-many-through has-many ruby-on-rails-5

我有一个设置,我希望能够建立一个角色记录,指向用户技能,场地,制作,群组等。

我把它设置为与一切事物有很多关系,因为角色和角色属于所有事物:

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

除了用户之外,所有都是相同的,当然这些用户对模型有很多细节。

每个表都有一个名称字段,一个id字段和标准时间戳字段。

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

当我尝试使用role_id,user_id和skill_id构建一个角色作为记录时,我在控制台中找回错误,说我需要所有内容的值。

这是否意味着我必须为每种类型的角色建立一个has_many through关系,并且它自己的“通过”?或者可以通过我想象的时尚工作来完成工作吗?为什么要尝试验证每个字段的数据是否存在?是因为索引?

如果我想关闭该验证,我甚至不确定将代码放在何处,因为我不确定验证的来源。

1 个答案:

答案 0 :(得分:1)

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