アクティブレコードとストアメソッド
はい、こんにちは。第21回のtanaken on Railsです。今週のThis Week in Railsから3つプレリクエストをピックアップします。
1つ目、raise a descriptive error when a store column is misconfigured,です。
こちらは、アクティブレコードに関する変更です。前提として、アクティブレコードコロンコロンストアについて紹介します。
このストアは、データベースの単一の絡みに、ハッシュとして複数の属性を保存するために使われる機能です。
具体的には、次のような例ですね。
ユーザーモデル、アクティブレコードを継承したユーザーモデルがあるとしましょう。
クラスユーザー継承していて、アクティブレコード。
で、ストアメソッドというのを使って、ストア第一引数にセッティングスのシンボル、
ストア、シンボルセッティングス、カンマ、第二引数以降が、アクセッサーズコロン、
ブラケット、配列か、配列のカラー、ホームページ、それぞれハッシュですね。
シンボルの配列、カラー、ホームページ、カンマ、コーダー、コロン、ジェイソン。
もう一回読みますね、すいません。長い。ちょっと説明しにくい。
もう一回いきます。
ストアメソッド、第一引数がセッティングスのシンボル、第二引数がアクセッサーズ、
これキーワード引数か、キーワード引数でアクセッサーズでアレイを渡していて、
アレイの中身がカラー、カンマ、ホームページ、それぞれシンボルですね。
で、三つ目がコーダーというキーワード引数で引数に渡しているのがジェイソンというようなことが書けます。
これは何をやっているかというと、セッティングスというカラムの中身がジェイソンです。
そのジェイソンにはカラーとホームページという二つの属性がありますよということを明記することができる。
こういうふうにストアメソッドを使って、今ユーザーモデルにセッティングスというカラムのアクセッサーを指定したんですけど、
これをやることで、セッティングスというカラムの中に入っているジェイソンのカラーとかホームページという属性をそれぞれユーザーから直接引いてくることができると。
通常のモデルの属性と同じように扱うことができますよということなんですよね。
具体的にどうやるのかというと、例えば小文字のユーザーという変数を定義して、
ユーザーイコールユーザークラスの.new括弧でカラーがブルーで、ホームページがexample.comというのをそういうユーザーインスタンスをnewしたとしましょう。
そうすると、小文字のuser.colorでブルーという文字率を参照できると。
user.homepageでexample.comを参照できるよという感じで、
本来、JSONで格納されているcolorblueとかhomepageexample.comというのをuser.colorという形で引いてきたり、
user.homepageという形で引いてきたりできるよと。便利だねという感じですね。
これらの仮属性、バーチャル属性みたいなものは、アクティブレコードのバリデーションやコールバックにも対応しています。
なので、colorがpresents trueか、ホームページの正規表現がうんぬんだとかというバリデーションとかコールバックにも対応しているよということですね。
ただし、このストアメソッドで定義した仮想の属性、今回でいうとcolorとかhomepageについては次のような注意事項があります。
2つありまして、1つ目がデータベースのスキーマには実際には存在しないですよね。
colorという絡むがあるわけじゃないので、直接的なデータベースのクエリは行えません。それはそうですよね。
また、大量のデータを保存する場合であったり、頻繁にデータの更新が行われる場合はパフォーマンスに影響を及ぼす可能性があります。
これはストア属性で定義したものというよりかは、JSON形式のカラムという感じですかね。
ストアアクセッサーメソッドの使用とエラーメッセージの修正
今のがストアに関する説明でした。
付け加えて、ストアアンダースコアアクセッサーというメソッドがあります。
今後はストアアクセッサーメソッドと呼びますね。
このメソッドは定義済みのストアに対して属性を追加できるというメソッドです。
例えば、先ほどのユーザークラスに関して、そのユーザークラスを継承したスーパーユーザークラスというのがあるとしましょう。
このスーパーユーザークラスはユーザーを継承しているので、セッティングスというストアはすでにユーザーの方で定義済みだと。
このセッティングスというストアに対して、ストアアクセサーメソッドを使って、
ストアアクセサー、第1引数がセッティングス、第2引数に、例えばプリビレッジーズ、特権みたいな権限みたいなアクセサーを追加するというような定義の仕方ができます。
このストアアクセサーを使うと、セッティングスにプリビレッジーズって新しい属性があるんだよというのを定義できたねと。
そんなことができますよというのがここまでが前提の話です。
さて、今回のプリリクエストでは、このストアアクセサーメソッドを使用する場合のエラーメッセージについての修正が行われています。
具体的には、まだ定義されていないストアに対して、ストアアクセサーメソッドを使って属性を追加して、その属性を参照しようとしたとき、
そんなときにエラーメッセージが出ると。
これあれなんですね。追加すること自体はエラーにはならないんですね。
参照しようとしたときにエラーになるんだというのを知ったんですけど。
このプリリクエストの修正前は、ノーメソッドエラーが出るようになっていました。
ノーメソッドエラー、アンディファインドメソッドアクセサー、なんちゃらかんちゃらみたいなのが出ていたと。
このエラーメッセージだと、何が間違っているのかよくわからないと。
このエラーメッセージをもうちょっと丁寧にしましたというので、修正後は、アクティブレコードコロンコロン、コンフィギュレーションエラーというのが出るようになっています。
このコンフィギュレーションエラーで具体的なメッセージは、
The column settings has not been configured as a store.
このセッティングスというのがストアとして設定されてないよと。
なので、プリビリッジズというのを追加しようとして参照しようとしているけど、
セッティングスがまだストアとして定義されてないから参照できないよ、みたいなエラーメッセージになったよということですね。
そんな感じのエラーメッセージが丁寧になりましたというお話でございます。
続いて2つ目。タイトルが、Don't configure Kamal storage volume if not neededというやつですね。
レールズプラグインの生成と設定ファイル
こちらはレールタイズに関する変更です。
前回のエピソードで、Kamalというアプリケーションデプロイツールについて紹介しました。
これはレールズアプリケーションをレールズニューコマンドで生成したときに、
Kamalというデプロイツールの設定ファイルとして、
config-sla-deploy.yamlというのを生成するようになったよというお話を前回しました。
今回のプレリクエストではこのdeploy.yamlに関して修正が行われています。
このyamlにはいろんな設定が書かれているんですけど、
その中にアクティブストレージを利用する場合のデプロイの設定というのも記載されておったと。
ただこの記載はアクティブストレージを使用しないアプリケーションにおいてはいらない記載なんですけど、
このレールズニューで作ったときに必ず記載されるようになっていたと。
それ不便だよねということで、
レールズニューするときにスキップアクティブストレージというオプションをそもそも指定できるようになっているんですけど、
このオプションが指定されているときには、
このdeploy.yamlの中のアクティブストレージに関する記述も記載しないようにするという修正が行われています。
ということで、気が利きますねという感じのレールズニューコマンド時の生成されるファイルの中身が気が利くようになったよということですね。
最後3つ目。
タイトルが、Add Robocop and GitHub Actions to Plugin Generatorというプレリクエストです。
こちらもレールタイズに関する変更です。
レールズにはプラグインを生成する機能、プラグインジェネレーターがあります。
レールズガイドにもレールズプラグイン作成入門というページがあるので参照してくださいというところなんですけど、
コマンドとしてはレールズプラグイン入というコマンドでプラグインを作成できるよと。
今回のプレリクエストでは、このコマンドを実行したときに次のファイルが生成されるようになりましたというプレリクエストです。
1つ目が.github-workflows-ci.yamlですね。
GitHub ActionsでCIを回すという設定のYAMLですね。
よくある設定ですけど、プレリクエストを作られたときと、あとはメインブランチにプッシュされたとき。
それをトリガーとしてRobocopでのリントを行うのと、プラグインのテストを実行するという設定が書かれたファイルです。
これが生成されるようになりました。
2つ目。.robocop.yaml。
これはCI.yamlでRobocopのリントを実行しているので、そのときにRobocopの設定ファイルが必要だなということで、
その設定ファイルも生成していますよという感じですね。
3つ目。.github-slur-dependabot.yaml。
これはDependabotの設定ファイルですね。
バージョン脆弱性を見つけてくれて、脆弱性というかバージョンアップを監視してくれるDependabotくんの設定ファイルになりますよと。
これらのファイルの生成はオプションスキップRobocopとかスキップCIというのを指定することでスキップできるようになっていますというふうに書いてあります。
ちょっと気になったのでまだ試してないんですけど、Dependabot.yamlの生成をスキップするオプションはなさそうなのかなという感じがしました。
ちゃんと調べてないけど。
スキップRobocopはあるので、Robocopの生成、Robocop.yamlの生成と、あとCI.yaml内でのRobocopでリントするような処理がスキップRobocopがあるというオプションを指定するとなくなるというのと、
あとはスキップCIというのを指定した場合はCI.yamlの生成自体がスキップされるという感じ。
という感じでした。
そんなところで3つ紹介してみました。
今週はここまでとします。
ではまた来週。バイバイ。