2012-11-12 5 views
1

한 가지 측면에서 3 가지 모델 관계에 대해 연구 중이며 접근 방법을 잘 모르고 있습니다. 여기에 기본적인 관계이다 :세 모델 관계 중 레일 유효성 확인

이 한 가지를 제외하고 매우 간단 물건
class Taxonomy 
    has_many :terms 
    # attribute: `inclusive`, default => false 
end 

class Term 
    belongs_to :taxonomy 
    has_and_belongs_to_many :photos 
end 

class Photo 
    has_and_belongs_to_many :terms 
end 

:

란다 될 수 있습니다 '인 클루 시브'또는 '독점'. 배타적이란 용어는 상호 배타적이며 배타적 인 의미는 배타적 인 의미입니다.

이제 문제없이 클라이언트 측에서 처리 할 수 ​​있지만 기본적으로 Photos (또는 다른 어딘가)에서 유효성 검사를 설정하는 방법을 잘 모르겠습니다. "하나 이상의 용어가 유효하지 않음을 확인하십시오. 독점 택 소노 미 (exclusive taxonomy)가이 기록과 관련이 있습니다. "

또한 보너스 질문

, 그것은 중요하지있는 동안, 나는 그것이이 분류 체계 및 사진, 예. 사이에 어떤 종류의 가입 설정에 좋을 것이다 생각해 봤는데, 내가하는 쉬운 방법을 싶습니다 지정된 분류에서 용어로 분류 된 모든 사진을 쿼리합니다.

나는 이것을 Photo.where('term_id in ?', Taxonomy.find(1).terms.map(&:id))과 같이 할 수 있다고 생각하지만, 그다지 우아하지는 않습니다. 저는 꽤 확신합니다. has_many : 용어는 사진에 관한 것이므로, 누군가가 그 관계를 설정하는 더 우아한 방법을 알고 있다면, 듣고 싶습니다.

감사합니다. 분류 체계는 exclusive 즉 경우

:


업데이트, 추가로 분류 아이디어를 설명합니다. taxonomy.inclusive = false이면 지정된 사진에 첨부 된 해당 분류의 용어 하나만있을 수 있습니다. 이제 사진에 여러 분류가 적용될 수 있습니다.

분류 : 색상, 클루 시브 조건 : 레드 (ID 1), 블루 (ID 2), 녹색 (ID 3)

분류 : 지역, 독점 조건 : 북미 (ID 4) 예를 들어 , 남아메리카 (id 5)

우리는 빨간색과 파란색이 많은 사진을 가지고 있다고 가정 해 봅시다.이 두 용어를 가져오고 남아메리카에있을 수 있습니다. 그러나 사진은 북미와 남미 모두에서 사용할 수 없습니다.

그래서이 경우에 우리가 호출하는 경우 : photo.terms.map &:id 우리가 기본적으로 내가 할 수있는 클라이언트 측 (의사 코드)

form_for photo 
- Taxonomy.each do |tax| 
    - if tax.inclusive? 
    - tax.terms.each do |term| 
     - check_box term 
    - else 
    - tax.terms.each do |term| 
     - radio_button term 

[1,2,4]

을 얻을 것입니다 그러나 모델 측면에서, 나는 싶습니다 예를 들어, 사진은 term_id 1,2,3 중 하나 또는 4,5 중 하나만 가질 수 있습니다.

의미가 있습니까?

class Term 
    validates :taxonomy_id, uniqueness: true, unless: Proc.new { |term| term.taxonomy.inclusive } 
end 

당신은 또한 custom validation method으로이 작업을 수행 할 수 있습니다

유효성 검사 문제에 대한

답변

2

, 당신은 단지 분류 즉, 포함되지 않은 경우 실행 taxonomy_id 필드 Term 모델에 고유성 유효성 검사를 추가 할 수 있습니다 : 첫 번째 방법은 같은 결과를 제공하지만, 당신이 할 수있는 더 복잡한 검증이있을 경우 유용 할 수 있습니다로는이 경우에 쓸모없는

class Term 
    validate :uniqueness_of_taxonomy_if_exclusive 

    def uniqueness_of_taxonomy_if_exclusive 
    if !taxonomy.inclusive && Term.find_by_taxonomy_id(taxonomy_id) 
     errors.add(:taxonomy_id, "already exists for this exclusive taxonomy") 
    end 
    end 
end 

참고.

질문의 두 번째 부분에 대한

, 여기에 액티브에서 쿼리를 만들 수있는 방법입니다, 이제 taxonomy을 가정 해 봅시다 당신이 사진을하려는 분류입니다 :

Photo.includes(:terms => :taxonomy).where('taxonomies.id' => taxonomy.id) 

UPDATE 귀하의 코멘트 후

사진과 용어를 연결하는 테이블에서 유효성 검사가 이루어져야한다고 생각합니다. Rails 규칙을 따르는 경우 실제로는 photos_terms 테이블입니다. 유효성 검사를 추가하려면 최상위 시민이되어야합니다. 즉,이 테이블과 ID 필드에 대한 활성 레코드 모델을 추가합니다 (예 : PhotoTermLink). 다음은 원하는 유효성 검사를위한 코드입니다.

+0

Adrien, 감사합니다! 그냥 분명히 말하자면, 독점 택 소노 미의 일환으로 하나 이상의 용어가있을 수 있습니다. 하나 이상의 용어가 사진과 관련되어서는 안됩니다. 그래서, 당신이 설명하고있는 유효성 검사가 그 것을 포함합니까? '배타적'택 소노 미를 한 용어로 제한하는 것처럼 보이지만 '독점'분류에서 한 용어로만 사진을 분류하는 것은 아닙니다. – Andrew

+0

죄송합니다. 귀하의 필요를 오해 했습니다만, 귀하가 원하는 유효성 확인으로 답변을 업데이트했습니다. –

+0

글쎄, 하나의 나머지 문제는 하나 이상의 분류에서 용어를 가질 수 있기 때문에, 사진은 여러 용어를 가질 수 있습니다. 따라서 habtm이라는 용어로 분류학을 위임 할 수 없습니다. 나는 이것이 합병증의 대부분을 일으키는 것 같아요. – Andrew