【问题标题】:has_one association through has_many with dynamic conditions - Railshas_one 通过 has_many 与动态条件关联 - Rails
【发布时间】:2018-11-16 01:16:25
【问题描述】:

我有三张桌子:

class Keeper
  has_many :assignments
end

class Assignment
  belongs_to :keeper
  belongs_to :assignment_group
end

class AssignmentsGroup
  has_many :assignments
  validate :uniqueness_of_keeper
end

与单个 assignment_group 关联的作业必须有一个保管人。我的问题是:鉴于所有关联的分配都将具有相同的保持器,我如何将has_one: keeper 关联添加到AssignmentsGroup

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    抱歉,如果我误解了您的问题,因为不清楚 AssignmentGroupAssignment 之间的关联应该是什么,但试试这个:

    class Keeper
      has_many :assignments
    end
    
    class Assignment
      belongs_to :keeper
      belongs_to :assignment_group # will need to add a reference to the assignments table
    end
    
    class AssignmentsGroup
      has_many :assignments
      has_many :keepers, through: assignments
      validate :single_keeper
    
      private     
    
      def single_keeper
        errors.add(:base, "can only have one keeper") unless keepers.uniq.length == 1
      end
    end
    

    https://guides.rubyonrails.org/active_record_validations.html#custom-methods

    【讨论】:

    • 哎呀,忘记添加belongs_to。是的,Assignment belongs_to :assignment_group。我的问题是如何将has_one :keeper 添加到AssignmentGroup
    • @dn1985 如果AssignmentsGroup has_many :assignments,你不会有很多守门员。但是通过验证规则,您应该能够添加该约束,这就是我在上面 single_keeper 验证中尝试显示的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多