ゲストユーザ用のデータを実データから用意する

SignUp 以前のユーザーに、実際に「動いている様子」を体感してもらう

Rails で個人用の英単語帳アプリを開発しています。開発環境は Rails 7.0.4 + Ruby 3.2.2 です。

ごくごく限られた知り合いに実際にアプリを触ってもらってフィードバックをもらうために、ゲストユーザを作成することにしました。アカウントは guest@example.com です。

アプリの性質上、一定量のデータをストックした時に効果が実感できる機能があります。このため、ゲストユーザ用のアカウントにある程度の実データを入れておくことで潜在的なユーザにアプリをよりよく知ってもらうことができると考えています。一定量のデータがあってはじめて体感できる要素を以下に挙げます。

  • 機能
    • 「今日学んだ単語」「最近1週間で学んだ英単語」「最近1ヶ月で学んだ英単語」
    • ページネーションの UI
    • 検索(対象、範囲、パフォーマンス)
  • パフォーマンス

ゲストユーザでのサービス体験のもう一つの目的は登録に関連した心理的抵抗を減らすことです。メールアドレスや OAuth アカウントを必要としないので、セキュリティ上の不安を払拭できます。まずはサービスを体験してもらって、気に入ったら登録すればいい「登録の自由」を確保することで、本当にサービスを必要とするユーザーのみに登録してもらうことができるのではないかと考えています。

sqlite3 で自分の英単語データをゲストユーザ用にコピーする

自分自身がサービスの最初のユーザであるので、実データは自分の英単語帳を使用します (^_^; 自分の user_id が 1 でゲストユーザの user_id が 6 である場合、CREATE TEMPORARY TABLE で作成した一時的なテーブルを経由して user_id:1 が持つレコードを user_id:6 にコピーしています。

実データのコピー元を user_id:1, コピー先を user_id: 6 とする

irb(main):001:0> User.all
  User Load (0.6ms)  SELECT "users".* FROM "users"
=>                                                              
[#<User:0x000000010d2aa630 id: 1, firebase_local_id: "ABC....", created_at: Fri, 28 Oct 2022 15:33:11.535747000 UTC +00:00, updated_at: Sun, 09 Apr 2023 14:51:21.497815000 UTC +00:00>,
 #<User:0x000000010d8ad168 id: 6, firebase_local_id: "XYZ...", created_at: Sun, 05 Feb 2023 15:15:26.484686000 UTC +00:00, updated_at: Sun, 05 Feb 2023 15:15:26.484686000 UTC +00:00>]
irb(main):002:0> 

CREATE TEMPORARY TABLE で作成した一時的なテーブルを経由して user_id:1 が持つレコードを user_id:6 にコピーする

➜ sqlite3 development.sqlite3
SQLite version 3.39.5 2022-10-14 20:58:05
Enter ".help" for usage hints.

sqlite> .tables
ar_internal_metadata  schema_migrations
flashcards            users

sqlite> CREATE TEMPORARY TABLE ephemeral AS SELECT * FROM flashcards;
sqlite> .tables
ar_internal_metadata  schema_migrations     users
flashcards            temp.ephemeral

sqlite> UPDATE temp.ephemeral set user_id = 6;

sqlite> SELECT user_id, COUNT(*) FROM flashcards GROUP BY user_id;
1|273

sqlite> SELECT user_id, COUNT(*) FROM temp.ephemeral GROUP BY user_id;
6|273

sqlite> INSERT INTO flashcards (item, example, source, created_at, updated_at, user_id) SELECT item, example, source, created_at, updated_at, user_id FROM temp.ephemeral;

sqlite> SELECT user_id, COUNT(*) FROM flashcards GROUP BY user_id;
1|273
6|273

sqlite> SELECT user_id, COUNT(*) FROM temp.ephemeral GROUP BY user_id;
6|273