2010-02-11 4 views
8

나는 티켓, 게시물, 보고서 등 몇 가지 모델이있는 응용 프로그램에서 작업하고 있습니다. 데이터는 각 모델마다 다르며 모든 모델에서 가장 최근의 항목 10 개 (모든 데이터가 혼합되어 있음)를 표시하는 "피드"를 만들고 싶습니다.다른 여러 Rails 모델에서 "피드"만들기

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 사용자에게 티켓이 지정되거나 새 보고서가 게시 될 때 새 피드 모델을 만들고 해당 테이블에 써야합니까? 또한 모델 참조 테이블을 작성하거나 데이터를 집계하는 클래스 메소드를 작성하기 위해 STI를 살펴 보았습니다. 어떤 방법이 가장 효율적인 지 확신하지 못합니다 ...

답변

6

당신 효율성 요구 사항에 따라 두 가지 방법 중 하나를 수행 할 수 있습니다. 필요에 따라

덜 효율적인 방법은 10 개 * N 항목을 검색하고 정렬하고 감소하는 것입니다

# Fetch 10 most recent items from each type of object, sort by 
# created_at, then pick top 10 of those. 
@items = [ Ticket, Post, Report ].inject([ ]) do |a, with_class| 
    a + with_class.find(:all, :limit => 10, :order => 'created_at DESC') 
end.sort_by(&:created_at).reverse[0, 10] 

또 다른 방법은 여러 기록과 다형성 연관을 가지고 인덱스 테이블을 만드는 것입니다. 한 번에 10 개만 표시하는 것에 관심이 있다면 사용자 당 10 개 또는 필요한 모든 범위로 제한하기 위해 일종의 레이크 작업을 사용하여 적극적으로 제거 할 수 있습니다.

+0

이것은 잘 작동하며 상당히 빠르게 움직이는 것처럼 보입니다. 다른 모델을 만드는 것을 피하려고했습니다. 감사. – jsiarto

+2

안녕하세요, 두 번째 옵션에 관심이있는 분들을 위해 다음 질문을 작성했습니다. http://stackoverflow.com/questions/7841553/creating-a-feed-from-multiple-rails-models-efficiently If 당신은 잠시 있습니다, 당신은 후속 조치를 확인할 수 있습니까? – jay

0

"table_name"및 "item_id"속성을 포함하는 항목 모델을 만듭니다. 그런 다음 각 데이터 유형에 대해 부분을 작성하십시오. 당신의 items_controller에서

i = Item.create(:table_name => 'tickets', :item_id => @ticket.id) 

: :보기/아이템/index.erb에서

def index 
    @items = Item.find(:all, :order => 'created_on DESC') 
end 

: 당신이 저장 한 후, 아이템 인스턴스를 생성,의는, 티켓을 가정 해 봅시다

<% @items.each do |item| %> 
    <%= render :partial => item.table_name, :locals => {:item => item} %><br /> 
<% end %> 
+0

이것은 STI를 수행하는 좀 더 수동적인 방법 인 것 같습니다. 유형 대신 table_name을 저장하면 레일이 STI를 처리하도록하는 이점이 있습니까? – jsiarto

관련 문제