2014-10-19 3 views
0

잠시 생각해 본 결과이 모델을 만드는 올바른 방법이 무엇인지 전혀 알지 못합니다.레일에서 서브 스크립 션 모델링하기

나는 이미지 공유에 중점을 둔 웹 사이트를 운영하고 있습니다. 사용자를 행복하게 만들기 위해 여러 다른 이미지 컬렉션을 구독 할 수 있기를 바랍니다.

지금까지 두 가지 유형의 컬렉션이 있습니다. 하나는 특정 이미지에서 작업 한 사람들을 정의하는 "생성자"관계입니다. 그 모습은 다음과 같습니다 :

사용자는 이미지에 객관적으로 존재하지 않는 주관적인 태그로 이미지에 태그를 지정할 수 있습니다. 전형적인 주관적인 꼬리표는 "우스운"또는 "슬픈"것을 포함 할 것입니다. 즉 다음과 같이 구현 것 :

class SubjectiveTag < ActiveRecord::Base 
    # Has a "name" field. The reason why the names of tags are a first-class DB model 
    # is so we can display how many times a given image has been tagged with a specific tag 
end 

class SubjectiveCollection < ActiveRecord::Base 
    # Basically, "User X tagged image Y with tag Z" 
    belongs_to :subjective_tag 
    belongs_to :user 
    has_many :images, through: :subjective_collection_member 
end 

class SubjectiveCollectionMember < ActiveRecord::Base 
    belongs_to :subjective_collection 
    belongs_to :image 
end 

나는 사용자가 로그인 할 때 홈 페이지에 순차적으로, 제작자 및 SubjectiveTags 모두 구독, 그 컬렉션에있는 모든 이미지를 표시 할 수 있도록하려면

. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 여러 구독 유형 (예 : SubjectiveTagSubscriptionCreatorSubscription) 중 하나를 사용해야합니까? 이 방법을 사용하면 각 컬렉션의 모든 이미지를 검색하는 가장 효율적인 방법은 무엇입니까?

답변

1

은 당신이 사용하고자하는 것은 Polymorphic Association입니다. 귀하의 경우에는

, 그 결과는 다음과 같습니다

  • user_id (정수)
  • subscribeable_id (정수)
  • :

    class Subscription < ActiveRecord::Base 
        belongs_to :user 
        belongs_to :subscribeable, polymorphic: true 
    end 
    

    subscriptions 표는 다음과 같은 필드를 포함해야

  • subscribeable_type (문자열)

이 설정을 사용하면 Subscription에서 다른 모델의 인스턴스를 참조 할 수 있습니다. ActiveRecord는 subscribeable_type 필드를 사용하여 가입중인 클래스의 이름을 기록합니다.

은 현재 로그인 한 사용자에 대한 이미지 목록을 생성하기 위해 당신이 할 수 있습니다 : 위의 방법의 성능에 영향이 (가입 당 하나 개의 쿼리) 참을 수 있습니다

Subscription.where(user_id: current_user.id).map do |subscription| 
    subscription.subscribeable.images.all 
end.flatten 

경우에, 당신은 붕괴 할 수 귀하 STI를 통해 하나의 테이블에 두 가지 유형의 구독 가능 (두 테이블이 유사하지 않으므로 여기서는 좋은 생각처럼 보이지 않음) 또는 두 가지 유형의 구독 모델/각 구독에 대해 별도로 쿼리하는 테이블

+1

다른 모델에는 'has_many : subscriptions, as : : subscribeable'이 필요합니다. – Substantial

+0

나는 이것을 이미 시도했다. 구독의 이미지를 찾으려고하면 ActiveRecord가 다형성 has_many : through 관계를 지원하지 않는다는 것을 알 수 있습니다. – TheSuper

+0

맞습니다. 하나의 쿼리로 결과를 가져올 수 없으므로 다형성 연관을 'have_many_through'할 수 없습니다.개요 (사용자의 홈페이지에서 구독 정보로 이미지를 표시) 한 경우 사용자의 구독 정보 (하나의 검색어)를 반복 한 다음 각 구독 정보 (각 구독 정보 하나씩)를 가져와야합니다. –

관련 문제