단일 테이블 상속을 사용하여 여러 컨텐트의 Like 정리

5296 단어 RubyRails
작업으로 개발된 서비스
  • 다양한 콘텐츠를 게시할 수 있음(개발됨)
  • 다양한 유형의 기고문 내용에 대해 각각 "괜찮다!"(개발됨)
  • 내 페이지에'좋아, 좋아!'의 합계수, 주간 순증가수 등(신개발)
  • 내 페이지에 직접 추가한의 컨텐츠를 시간순으로 표시(신규 개발)
  • 이런 방법에 힘쓸 필요가 있다.
    개발이 시작되었을 때의 책상 구조는 다음과 같다
    각 컨텐츠의 데이터를 저장하는 테이블(왼쪽의 경우articles 등)
    "그래!"의 데이터 저장표(오른쪽article_likes 등)의 설계 실현.

    그렇지만
  • 내 페이지에'좋아, 좋아!'의 합계수, 주간 순증가수 등(신개발)
  • 내 페이지에 직접 추가한의 컨텐츠를 시간순으로 표시(신규 개발)
  • 실현하기 위해 hoge_likes표는 내용의 수량만 있다
    합계수hoge_likes만join표의 수량을 직접 얻기 위해
    만약 비정규화된 열이 데이터를 누적하게 한다면, 조금의 노력도 들이지 않고는 실현하기 어렵다
    "그래!"관련 데이터likes를 한 표에 모아라.likes 표 데이터를 종합할 때 Rails의ActiveRecord의 단일 표를 이용하여 계승하는 기능
    데이터베이스 세계에서 표는 하나로 통합된다
    왜냐하면 Rails 모델을 대상으로 하는 내용에 따라 구분할 수 있기 때문이다
    이번에 만족하고자 하는 조건은 기본적으로 상업 논리 부분을 만지작거리지 않아도 실현될 수 있다.

    Rails의 단일 테이블 상속에 대해서는 다음을 참조하십시오.
    또한 구체적인 작업 내용은 다음과 같이 Like 모델을 정의했다
    $ rails g model Like user_id:integer content_id:integer type:string
    
    Like 모델에서 전체 공통의 association·validation 등을 실현
    class Like < ActiveRecord::Base
      belongs_to :user
      validates :user, presence: true, uniqueness: { scope: [:content_id, :type] }
      validates :content_id, presence: true
    end
    
    Like 상속 모델 클래스의 형식으로 각 내용에 대응하는 Like의 클래스를 만들고 각 클래스에 필요한 코드를 기술한다.
    일반적인 대상방향 상속과 같기 때문에 라이크 모델 클래스에 정의된validationassociation도 당연히 상속 클래스에 적용된다.
    제작association시 외부 키를 제대로 지정하지 않으면'없습니다article_id'라는 욕을 먹을 수 있으니 주의해야 한다
    class ArticleLike < Like
      belongs_to :article, foreign_key: 'content_id'
      # 以下何かしらクラスごとに必要なコードを記述していく...
    end
    
    class ArticleCommentLike < Like
      belongs_to :article_comment, foreign_key: 'content_id'
    end
    
    그뿐이다ArticleLikeArticleCommentLike는 다른 책상에 대응하는 모형과 같다.
    실제로 콘솔을 사용하여 각 반에서 Active Record를 호출하는 방법을 시험해 본다
    각각 다른 모델 클래스에서 새로운 대상을 만들지만 데이터베이스 기록은 같은 표에 삽입됩니다Like는 각각 모델에서 계승된 자류 대상을 얻을 수 있다.
    > ArticleLike.create(user_id: 1, content_id: 1)
      => #<ArticleLike id: 1, user_id: 1, content_id: 1, type: "ArticleLike", created_at: "2016-11-17 03:20:56", updated_at: "2016-11-17 03:20:56">
    
    > ArticleCommentLike.create(user_id: 1, content_id: 1)
      => #<ArticleCommentLike id: 2, user_id: 1, content_id: 1, type: "ArticleCommentLike", created_at: "2016-11-17 04:20:56", updated_at: "2016-11-17 04:20:56">
    
    > Like.all
      => #<ActiveRecord::Relation [#<ArticleLike id: 1, user_id: 1, content_id: 1, created_at: "2016-11-17 03:20:56", updated_at: "2016-11-17 03:20:56">, 
    #<ArticleCommentLike id: 2, user_id: 1, content_id: 1, created_at: "2016-11-17 04:25:21", updated_at: "2016-11-17 04:25:21">]>
    
    
    이 특성을 이용하여 자신을'좋아!'라고 길렀다.스스로 말하다시간순으로 다운로드한 내용을 가져오고 표시합니다
    등 기능의 개발은 매우 간단해졌다.

    좋은 웹페이지 즐겨찾기