단일 테이블 상속을 사용하여 여러 컨텐트의 Like 정리
개발이 시작되었을 때의 책상 구조는 다음과 같다
각 컨텐츠의 데이터를 저장하는 테이블(왼쪽의 경우
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의 클래스를 만들고 각 클래스에 필요한 코드를 기술한다.일반적인 대상방향 상속과 같기 때문에 라이크 모델 클래스에 정의된
validation
과association
도 당연히 상속 클래스에 적용된다.제작
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
그뿐이다ArticleLike
와 ArticleCommentLike
는 다른 책상에 대응하는 모형과 같다.실제로 콘솔을 사용하여 각 반에서 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">]>
이 특성을 이용하여 자신을'좋아!'라고 길렀다.스스로 말하다시간순으로 다운로드한 내용을 가져오고 표시합니다등 기능의 개발은 매우 간단해졌다.
Reference
이 문제에 관하여(단일 테이블 상속을 사용하여 여러 컨텐트의 Like 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/YudaiTsukamoto/items/5d034995ef55855d8742텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)