2012-06-03 2 views
3

Rails 앱에서 여러 모델을 단일 활동 피드로 결합하고자합니다.여러 모델에서 (고성능) 활동 피드를 만드는 방법은 무엇입니까?

예를 들어 게시, 댓글, 사진, 상태 모델이 있습니다. 각각은 사용자, 기관 및 도시에 속합니다. 사용자/기관/도시 쇼 페이지에서 최근 활동의 연대순 목록을 표시하려고합니다.

SO의 다른 질문을 둘러보고 다른 질문을 보면이 문제에 대해 두 개의 학교가있는 것으로 보입니다.

  1. 다형성 ActivityFeed 모델을 만듭니다. 예 : a 사용자 has_many :posts as: feedable. 그런 다음 ActivityFeed 컬렉션을 각 쇼 페이지에 렌더링하십시오.
  2. 결합 된 배열을 만들고 렌더링합니다. @user_feed = @user_photos + @user_comment +..

그러나 각 방법의 장점과 단점에 대해서는 많이 알지 못합니다.

다른 사람이 비슷한 것을 시도한 사람이 있습니까? 접근 방법을 선택할 때 어떤 문제에 대해 생각하거나 계획해야합니까? 각 데이터베이스는 얼마나 잘 수행됩니까?

내 요구 사항은 다음과 같습니다

  1. 은 상위 모델에 속하는 모든 항목을 표시합니다.
  2. 여러 가지 유형의 상위 모델 (사용자, 기관, 도시 등)을 갖습니다.
  3. 활동 피드의 각 항목에 대해 클래스에 따라 부분적으로 다른보기를 렌더링합니다.

모든 생각, 개인적인 경험 또는 이에 대한 추가 정보에 감사드립니다. 세 번째 옵션을 찾고 있습니까? 여러 쿼리에서 결합 된 배열을 만드는 성능에 특히 관심이 있습니다.

감사

+0

당신이 두 번째 유형의 목표에 따라 예상 요청을 할 수 있습니다 마음에? – Blankman

답변

3

나 요구 사항에 몇 문제를 추가 상위 모델로 상위 모델

  • 쉽게 다양한 유형의 허용
  • 쉽게 속하는 표시 모든 항목의

    1. 쉽게하자 클래스 종속 템플릿 렌더링
    2. 공유 작업 기능의 리팩토링 용이성
    3. 잠재적 인 활동 제어 기능 (읽기, 구독, 팔로우, 공유 등으로 표시) 통합의 용이성 다양한 유형의 활동의 역순으로 볼 때, 다형성 피드를 계산하기가 쉽다.나 5, 6, 첫 번째 옵션 찬성 7 ​​개 DEFO 팁을 들어 부모

    에 집계 활동 수를 계산

  • 용이성, 내 코드는 다음과 같습니다

    class Activity 
        belongs_to :activity, polymorphic: true 
        belongs_to :user, counter_cache: true 
        belongs_to :institution, counter_cache: true 
        belongs_to :city, counter_cache: true 
    end 
    

    스코프를위한 도시의 뉴스 피드 아니라 이미 asso 이후 빠른 목록을 충분히 당신을 줄 수있는이 한 테이블에 싼 검색 것을

    city.activities.order('updated_at DESC').limit(20) 
    

    노트 (1,2,6을 보여주는) ciation loading (.includes(:activities) 일 것입니다.)와 같은 것을 표시 할 필요는 없습니다.

    Joe from NYU, New York has posted a comment 
    Mel from UCL, London has added a new photo 
    

    4 활동이 별도의 클래스이고 5 또한 표준 활동 제어기로 부드러울 경우 사소한 것입니다. 퀵리스트보기/활동과 같은 공유 렌더링 부분은 자연스러운 장소가됩니다. 7 counter_cache를 사용하면 쉽게 완료 할 수 있습니다. has_many 수 있도록하여, 보너스로 : 등을 만드는 것처럼 각 유형에 활동을, 당신은 활동의 유형을 구별 할 수 업데이트, 읽기,

    희망이

  • +0

    viktor, 훌륭한 답변에 감사드립니다. 나는 확실히 활동 모델을 매우 강하게 고려하고있다. 그러나 나는 다음과 같은 문제에주의한다. 활동 모델을 수행하는 가장 좋은 방법은 컨텐츠 모델 (코멘트, 게시물 등)의 user_id, city_id, institution_id를 이동하여 활동 모델로 이동하는 것입니다. 이 데이터베이스 설계로 인해 불편을 겪고 있습니다. 소유권은 post/photo/etc 레코드의 필수 부분이며 해당 모델에 있어야합니다. 이것에 대한 당신의 생각은 무엇입니까? –

    +0

    콘텐트 모델에 belongs_to-s를 여전히 3 개 보유하고 콜백에서 복제하여 콘텐트에 활동을 추가합니다. 이 복제는 간단한 설정에서의 최적화를위한 것이지만 복잡한 활동 모델이있는 경우에는 연관성이 분리 될 수도 있습니다 (조 하트 멜의 사진 :) –

    +0

    감사합니다. 이에 대한 좋은 예나 정보를 추천 할 수 있습니까? –

    관련 문제