Rails 5 Model Association has_many:通过,验证child只能属于一个父级

时间:2017-11-09 20:25:16

标签: ruby-on-rails activerecord model-associations

有问题的3个型号。停电,儿童,关系。

停电可能会有很多孩子。 一个孩子属于停电。 关系是中间人表。

一个孩子一次只能属于一次停电(即,如果孩子123属于停电A,你不能将孩子123与不同的停电联系起来)

每次停电中的孩子必须是独一无二的。 (我在validates_uniqueness_of模型中使用Relationship解决了这个问题。

class Outage < ApplicationRecord
    has_many :relationships
    has_many :children, :through => :relationships
end

class Child < ApplicationRecord
    has_many :relationships
    has_many :outages, :through => :relationships 
end

class Relationship < ApplicationRecord
    belongs_to :outage
    belongs_to :child
    validates_uniqueness_of :outage_id, :scope => :child_id
end

我尝试设置一个自定义验证器(在child.rb中):

def has_one_outage
    if outages.length > 1
        errors.add(:base, "a child can only belong to one outage at a time")
    end
end  

但验证似乎没有影响。

对我在这里做错了什么的见解?

1 个答案:

答案 0 :(得分:0)

能够通过以下方式解决问题:

class Outage < ApplicationRecord
    has_many :relationships
    has_many :children, through: :relationships
end


class Child < ApplicationRecord
    has_many :relationships
    has_many :outages, through: :relationships
end


  class Relationship < ApplicationRecord
    belongs_to :child
    belongs_to :outage
    validate :ensure_one_relationship

    def ensure_one_relationship
      if Relationship.where(child_id: self.child_id).present?
          errors.add(:base, "A trouble ticket can only be associated with one outage ticket.")
      end
    end
  end