【问题标题】:has_many through invisible validations?has_many 通过无形的验证?
【发布时间】:2016-12-03 13:29:38
【问题描述】:

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

我将其设置为与所有事物之间存在多重关系,通过角色和属于所有事物的角色:

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 关系及其自己的“通过”?或者一个 has_many 可以按照我设想的方式通过餐桌工作吗?为什么要尝试验证每个字段的数据是否存在?会不会是索引造成的?

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 它不会让我投票给你,因为我是一个肮脏的 NOOB,但是谢谢!跟进:我应该以不同的方式对此进行建模吗?
    • 更新了答案以添加可选标志。我认为这可能是一个更好的方法
    • 如果你不能投票,如果它解决了你的问题,你可以接受答案
    • 再次感谢。我不知道复选标记是可点击的。更新的答案是完美的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2015-03-23
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多