Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
pixivコミックで作品が公開されるってどういうこと?
Search
imadoki
October 05, 2023
Programming
1.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
pixivコミックで作品が公開されるってどういうこと?
PIXIV MEETUP2023のLTで発表した際の資料です
imadoki
October 05, 2023
More Decks by imadoki
See All by imadoki
Multiple Databasesを用いて2つのRailsプロジェクトを統合する
imadoki
1
2.1k
Other Decks in Programming
See All in Programming
protojson における文字化けの扱い
kazuki1023
0
150
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
160
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
260
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
290
Event is what happens
moro
2
3.8k
AI-Powered Domain-Driven Design
ziobrando
0
410
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
330
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
150
動画プレイヤーはなぜカクつくのか 〜Flutterのレンダリングとネイティブの境界を解剖する〜
naruogram
0
330
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.7k
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
160
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
470
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
610
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
630
Un-Boring Meetings
codingconduct
0
490
Rails Girls Zürich Keynote
gr2m
96
14k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Design in an AI World
tapps
1
380
YesSQL, Process and Tooling at Scale
rocio
174
15k
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を使ってデータの取得を簡便化
ご清聴ありがとうござい ました!