2009-07-02 6 views
8

레일스에서 ​​여러 ActiveRecord 객체의 결과를 결합하는 효율적인 방법이 있는지 궁금합니다. 예를 들어 세 개의 개별 테이블을 세 번 호출 할 수 있으며 결과를 결합하여 공통 열로 정렬하려고합니다.ActiveRecord 객체를 결합하는 방법은 무엇입니까?

가 여기에 희망이 이해하기 쉽게 내 질문을 할 것입니다 슈퍼 기본 코드 예제 :

@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

@combined_results_sorted_by_date_column = (how?) 

다른 사람에 의해 제안으로, 여기에 문제가 하나 개의 솔루션입니다.

@combined_results = @result1 + @result2 + @result3 
@combined_results.sort! {|x,y| x.date <=> y.date} 

날짜순으로 정렬하고 싶지만 Table3은 "created_on"열을 날짜로 참조합니까?

답변

2

"테이블"대신 오히려 개체를 사용하지 마십시오. 당신이 그것에 대해 이런 식으로 생각한다면

, 그것은 아무 의미가 없다 할 수 있도록합니다 :

@results1 = Users.find(:all) 
@results2 = Posts.find(:all) 
@results3 = Comments.find(:all) 

어떤이의 "결합"양식을 의미 것인가?

아마도 원하는 것은 서로 다른 "쿼리"를 사용하여 같은 종류의 결과를 결합하는 것입니다. 그게 맞습니까?

+0

문제 관리 응용 프로그램에서 타임 라인에 대한 의견, 상태 및 커밋을 결합한 유스 케이스가 있습니다. – dangerousdave

+0

이 경우에는 모두 특정 인터페이스에 응답해야하며 하나의 인터페이스에 매핑해야합니다. 요점은 "데이터베이스 테이블"의 관점에서 생각하면 열악한 디자인으로 이어질 것입니다. 나는 당신이 다른 장소의 데이터를 사용하지 않는다는 것을 암시하려는 것이 아니며, 그것에 대해 어떻게 접근하고 생각하는지에 대해서만 의문을가집니다. –

0
@combined_results = @result1 + @result2 + @result3 
@combined_results.sort! {|x,y| x.date <=> y.date} 

이것은 세계에서 가장 효율적인 코드는 아니지만 반드시 필요한 것일 수 있습니다.

일부 모델에는 날짜 방법이없는 경우 모델을 만드는 것이 좋습니다. 그것은 쉽습니다.

def date 
    created_on 
end 
0
@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

combined = (@results1 + @results2 + @results3).sort { |x, y| x.date <=> y.date } 
+0

날짜순으로 정렬하고 싶지만 Table3은 "created_on"열을 날짜로 참조합니까? 큰 감사를 드린다! – Jess

+0

"created_on"값을 반환하는 Table3에 "date()"메서드를 추가하여이를 해결할 수 있습니다. – Ethan

14
@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

@combined_results_sorted_by_date_column = 
    (@results1 + @results2 + @results3).sort_by(&:date) 

내가 날짜별로 정렬 할 만 표 3 날짜로 "created_on"열을 참조하는 경우?

class Table3 
    alias_method :date, :created_on 
end 

하거나

class Table3 
    alias date created_on 
end 
0

나는 데이터 볼륨이처럼 무엇인지 모르겠지만, 정렬에 올 때, 데이터베이스는 당신이 이제까지 "사용하는 것보다 그것의 더 나은 일을 할 것입니다 응용 프로그램 계층 "코드.

모델 객체의 배열로 반환되는 데이터가 필요합니까? 3 개의 테이블이 3 개의 서로 다른 모델 클래스의 혼합 된 배열을 생성 할 가능성이 있습니까?

왜 직접적인 SQL 반환 행과 열을 사용하고 DB가 데이터를 정렬하는 데 열심히 노력해야합니까?

1

아마도이 답변을 좋아할 것 같지 않지만 데이터베이스 스키마를 수정할 수 있습니다. 나는 비슷한 상황에 있었고, 그들을 연결 한 후에 결과를 정렬하는 것은 확실히 당신이 가고 싶은 방식이 아닙니다.

+1

나는 당신을 믿는다. 그러나 당신이 상황을 어떻게 다루 었는지 구체적으로 말할 수 있겠는가? – iterion

0

ActiveRecord 객체의 혼합 된 배열을 원하는 것으로 가정합니다. 일종의 날짜로 정렬됩니다.

@array = (Bucket.all + Mop.all + Detergent.all).sort{|x,y| x.sort_by <==> y.sort_by} 

sort_by 필드는 각 객체 유형마다 다르므로이를 정의해야합니다.

class Bucket < ActiverRecord::Base 
    def sort_by 
    cleaned_on 
    end 
end 

class Detergent < ActiverRecord::Base 
    def sort_by 
    purchased_on 
    end 
end 

당신은 UNION을 사용하여 단일 쿼리에서 정렬 된 모든 데이터에 끌어 수 있지만, 그 중 AR 오브젝트를 얻을 것입니다.

관련 문제