Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
pixivコミックで作品が公開されるってどういうこと?
Search
imadoki
October 05, 2023
Programming
1
1.2k
pixivコミックで作品が公開されるってどういうこと?
PIXIV MEETUP2023のLTで発表した際の資料です
imadoki
October 05, 2023
Tweet
Share
More Decks by imadoki
See All by imadoki
Multiple Databasesを用いて2つのRailsプロジェクトを統合する
imadoki
1
1.5k
Other Decks in Programming
See All in Programming
Immutable ActiveRecord
megane42
0
140
Rubyで始める関数型ドメインモデリング
shogo_tksk
0
110
Honoとフロントエンドの 型安全性について
yodaka
7
1.2k
技術を根付かせる / How to make technology take root
kubode
1
250
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
37
14k
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
780
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
280
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
270
Honoのおもしろいミドルウェアをみてみよう
yusukebe
1
210
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
250
Introduction to kotlinx.rpc
arawn
0
700
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Building Your Own Lightsaber
phodgson
104
6.2k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Producing Creativity
orderedlist
PRO
344
39k
GitHub's CSS Performance
jonrohan
1030
460k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Automating Front-end Workflow
addyosmani
1368
200k
Transcript
pixiv Inc. pixivコミックで作品が公開 されるってどういうこと? @ikumin
Profile ikumin エンジニア 2016年入社 コミック事業部 pixivコミック部 業務では主にバックエンドを担当し ていてRailsを書いています
• 2012年から始まったマンガ サービス • ブラウザ/Android/iOS • 商業作品の連載 • 電子書籍の販売 •
pixivに投稿された作品の閲覧
• 期間中、無料で何度も読める • 購入すると読める 連載エピソードの形態
エピソードの公開設定
基本のデータ
エピソードの公開設定 • 公開期間 • 種類 • (種類によっては)価格
エピソードの公開設定 # 公開設定 class PublishingSetting < ApplicationRecord ## typeによってどの公開設定化を判別する def
free? type == 'PublishingSetting::Free' end def sell? type == 'PublishingSetting::Sell' end end
全話開放キャンペーン
公開中のエピソードを取得するには • 各種公開フラグがONかどうか? • 期間内の公開設定はあるか? • 全話開放キャンペーン対象かどうか? を確認する必要がある
普通にやってみる SELECT `stories`.* FROM `stories` INNER JOIN `works` `work` ON
`work`.`id` = `stories`.`work_id` INNER JOIN `magazines` `magazine` ON `magazine`.`id` = `work`.`magazine_id` INNER JOIN `publish_all_story_campaign_works` ON `publish_all_story_campaign_works`.`work_id` = `work`.`id` INNER JOIN `publishing_settings` ON `publishing_settings`.`story_id` = `stories`.`id` WHERE `work`.`is_public` = 1 AND `magazine`.`is_public` = 1 AND ( (`publishing_settings`.`start_at` <= :now) AND (`publishing_settings`.`finish_at` < :now OR `publishing_settings`.`finish_at` IS NULL) OR `publish_all_story_campaigns`.`approved` = 1 )
他にも… • レーティングの問題でアプリでは表示できない作品がある • 販売中のエピソードをは購入しなければ読めない • 公開中の作品の最新話を取得したい • 最新話の公開日順に作品を並べ替えたい
• 公開中のエピソードへの関連と 最新話の公開日を持つキャッ シュ代わりのテーブルを用意 • 毎日12時に更新 キャッシュテーブルの用意
• 一括で取得した情報をモデルのインスタンスに紐づけて くれるgem • https://github.com/walf443/bulk_loader BulkLoaderの利用
購入情報を一括で取得する class Story < ApplicationRecord #... bulk_loader, :purchased? do |ids,
user_id| next {} if user_id.nil? # APIで購入の有無を問い合わせ purchased_story_ids = Store::App::OrderedEpisodes.get(user_id, ids) # {id => purchased?} という形式のHashに変換 ids.index_with {|id| purchased_story_ids.include?(id) } end end
購入情報を一括で取得する # ログインユーザーがstoriesを購入しているかどうかを調べる Story.bulk_loader.load(:purchased?, stories, current_user) stories.each do |story| story.purchased?
# bulk_loaderでAPIから取得したエピソードごとの購入 有無を引ける end
• エピソードが購入済みか • エピソードが無料公開中か • エピソードが販売中か • 作品が全話開放キャンペーン中か これを利用して
まとめ • 複雑な要件に対応するため、いろんなところに公開に関 わるデータが散らばっている • 複数のテーブルに絡んだ条件をキャッシュして緩和 • BulkLoaderを使ってデータの取得を簡便化
ご清聴ありがとうござい ました!