2017-11-09 15 views
0

3 모델. 정전, 아동, 관계.Rails 5 Model Association has_many : through, validate 자식은 한 부모에만 속할 수 있습니다.

작동이 중단되면 많은 아이들이있을 수 있습니다. 어린이가 정전에 속합니다. 관계는 중개자 테이블입니다.

아이는 각 장애의 아이들이 고유해야합니다

(아이 123이를 정전에 속하는 경우, 다른 장애와 연관 아이 (123) 기운, 즉) 한 번에 하나의 정전에 속할 수 있습니다. (Relationship 모델에서 validates_uniqueness_of으로 해결했습니다.)

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 

검증은 그래도 영향을 미치는 것 같다하지 않습니다.

내가 여기서 잘못하고있는 것에 대한 통찰력이 있습니까?

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 
+2

왜 당신이 다음 대신 has_many''의'has_one'을 사용할 수 없습니다 – potashin

+1

'Child' 모델에서'has_one : relationship'과'has_one : stopped, : through => : relationship'을 사용하지 않으시겠습니까? [Rails 안내서] (http://guides.rubyonrails.org/association_basics.html#the-hasone-association)는이 연관성을 설명합니다. –

+0

@TomAranda 맞아, 내가 생각했던거야. 그것을 시도했지만 여전히 아이들이 다른 정전과 관련 지을 수 있습니다. – DnfD

답변

0

은 다음과 그것을 해결할 수 있었나요?