2014-02-20 3 views
2

개발중인 Rails 애플리케이션에는 ReviewInterview의 두 가지 모델이 있습니다. 둘 다 본질적으로 기사이지만 특성과 행동면에서 다릅니다.2 개의 ActiveRecord 모델을 하나로 결합

일부 응용 프로그램 페이지는 동일한 모델 인 것처럼 검토 및 인터뷰를 함께 표시해야합니다. 이것은 필자가 어떻게 든 그들을 하나의 모델로 모으고 그 모델을 "프록시"로 사용할 필요가 있음을 의미합니다.

나는 다음과 같은 코드를 가진 Article 모델을 구현하여 기본적인 결과를 얻을 :

class Article 
    MODELS = [Review, Interview] 

    def self.fetch(&block) 
    block = Proc.new { all } unless block_given? 
    results = [] 

    MODELS.each do |model| 
     suppress(StandardError) do 
     results.push(*model.class_eval(&block)) 
     end 
    end 

    results 
    end 
end 

이 나에게 내가 필요로하는 기본 기능을 제공합니다. 이제 Article.fetch { where("created_at >= ?", 10.days.ago.to_date) }과 같은 것을 사용할 수 있으며 동일한 쿼리가 두 모델에서 실행되어 여러 결과를 얻을 수 있습니다 (날짜별로 정렬되지는 않지만 실제로 두 개의 서로 다른 쿼리에서 온 리뷰와 인터뷰가 함께 정리됩니다).

이 접근 방식은 효과가있는 것으로 보이지만 몇 가지 중요한 단점도 있습니다.
큰 결과는 정렬 결과를 올바르게 정렬하려면 쿼리 후 수동으로 구현해야한다는 것입니다.

내가 만나는 문제를 해결하기 위해 내 자신의 방법을 구현하는 데 아무런 문제가 없지만, 레일에서 이것을 달성하기 위해 표준 방법이 있는지 궁금합니다.

답변

1

문제를 살펴보면 기본적으로 서로 다른 특성 및 동작을 가진 두 가지 모델이 있습니다.

한 가지 방법은 부모 클래스에서 상속 한 2 개의 하위 클래스로 부모 클래스를 만드는 것입니다.

class Review < Article & class Interview < Article

단일 테이블 상속 (STI) 방법을 사용

class Article, 당신은 두 가지를 차별화하고 검증하고 열이 서브 클래스를 기반으로 채 웁니다있는 것 유형 열을 만듭니다.

+0

같은 테이블에서 두 모델 모두에 필요한 모든 열을 가져야합니까? –

+0

동일한 테이블에 필요하면 예 및 유효성 검사가 클래스를 기반으로합니다. – jamesy829

관련 문제