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
我有一个设置,我希望能够在其中建立角色记录以指向用户技能、场地、作品、小组等。
我将其设置为与所有事物都有许多直通关系,角色和角色属于所有事物,如下所示:
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