まず、このような素晴らしいアプリを開発してくださった開発者の方々に感謝申し上げます。
少し混乱している点について、 clarification をいただければ幸いです。Rails 6 において $ rake db:* コマンドを初期化に用いる正しい方法は $ rake db:prepare だと理解していたのですが、Discourse では $ rake db:prepare だけを単独で実行しても正しく初期化されません。Meta やこちらの議論を見ると、prepare はテストデータの初期化や、バックグラウンドで実行されるタスクの一部でのみ使用されているように見えます。
Discourse のデータベースをマイグレーションや初期化のために設定する際に、$ rake db:migrate だけで十分なのか、またその理由についてご教示いただけますでしょうか?
michaeld
(Michael - Communiteq)
2
まずは db:create を実行してから、マイグレーションを行ってください。
pfaffman
(Jay Pfaffman)
3
マイケルが言ったように、データベースが存在している必要があります。私は定期的に
rake db:drop db:create db:migrate
を実行して、データベースをクリーンな状態にリセットしています(新しいインストールのバックアップを保存するのを忘れた場合などに使います)。
ビルドプロセスはデフォルトで db:create を実行する必要があると思います。私のインスタンスに何か機能を見落としている可能性はありますが、アセットのプリコンパイル(あるいはそれと同等のもの)とマイグレーションのみでインスタンスは正常に動作しているように見えます。
調査を進めたところ、私が探していた答えに関する追加情報が見つかりました。
Discourse の rake タスクが Rails の db:migrate を上書きしているようです。これは Rails アプリとしては異例のことだと考えられます(例:この PR: Sign in to GitHub · GitHub の動作を確認すると、ActiveRecord に直接アクセスして期待されるデータベースのセットアップを行いますが、アップストリーム側で独立して実行されることが期待される他の必要な db:* タスクは呼び出されません。これは、上流側から期待される部分が上書きされているためです。
補足として:現在私が設定している Discourse の構成では、Discourse のデータベースユーザーに権限を昇格させることはできません。そのため、ビルド後に db:drop や db:create のような操作を行うには、私が実装した設定からわずかな変更が必要になるようです。