Open13

Rails

りんだりんだ

Railsの基本思想(by DHH)

  • DRY
  • 設定より規約を優先する
    • Railsの定める規約を守ることで、Webアプリケーション開発においてほぼ必ず通るであろう、設計・実装上の瑣末な項目に関して、考えたり議論したりするコストが減る
  • メニューは”おまかせ”で
    • 基本的にはRailsの作ったツール群をそのまま使うことで、既に洗練されているツールの恩恵を受けることができる
    • どうしてもユースケースに合わない場合は独自でも全然OK
  • パラダイムが1つではない
    • Railsは多くの異なる考え方やパラダイムから構成されている
    • ほとんどの個々のパラダイムは、ある問題の特定の空間でよく機能するが、それ以降のちょうどよい範囲を超えて適用される場合は、厄介なもの、あるいは柔軟性のないものになる
    • 多くのパラダイムを組み合わせることで、守備範囲広く問題に対応できる
  • 美しいコードを称える
    • コードが美しいと開発者が気持ちいいので追求しよう、みたいな話
    • ここでいう美しさとは、行数が少なく、カードの見た目がシンプルな状態を指していると思われる
    • これがたぶん別の見方をすると「Railsは機能を隠蔽しがち」と言われる所以なんだろうなと思う
  • 統合システムを尊重する
    • フロント・バック・インフラ、その辺の領域を一気通貫で扱っており、そのシステムを尊重する
  • 安定性より進歩を重視する
    • 今使ってくれてる人の慣れに配慮するのも大事だけど、システムの進歩の方が大事
  • テントを押し上げる
    • Railsを使う人・作る人に関して、来る人拒まず、参入のハードルを低くする
    • たとえばDHH個人は、Railsをビュー部分を含めたフレームワークとして推すことに尚注目し続けているが、一方でAPIとしてフロントと独立した使われ方をする、というのもアリだし、その用途でも役立つ余地は必ずあると思っている。

https://postd.cc/rails-doctrine/#optimize-for-programmer-happiness

りんだりんだ

STI

STI(Single Table Inheritance)は単一テーブル継承。
Railsでデフォでサポートされていて、一つのテーブルに複数のモデルを扱う感じ。ここでのモデルは擬似的なテーブルと粒度が同じになる。たとえば、UserとCampanyというモデルを、Customerという一つのテーブルで一緒くたに管理する。Railsではtypeというカラムを使って、どの種類のデータ(モデル)なのかを判断する。

よくわかんないけど、この手法を敬遠する記事は多かった。上でいうとUser用のカラムを設けたとして、Customer側の全データでそこはNULLになってしまう。これが擬似テーブルの数も増え、カラムの数も増え、となると、テーブルにNULLが溢れるためよくない(そもそもなぜテーブルにNULLが入ることが良くないのかはまだ知らない)。

https://qiita.com/gakinchoy7/items/9b6857558c31574fc489

りんだりんだ

CTI

CTI(Class Table Inheritance)はクラステーブル継承。
抽象クラスも、具象のクラスも、すべてテーブルを作成する。STIの例でいうと、CustomerもUserもCumpanyも全部テーブルとして存在する。

抽象クラスのテーブルでは、STIと同じくtypeというカラムで、どの種類(モデル)のデータかを表現する。具象クラスのテーブルでは、抽象側にはないそのテーブルだけが必要なカラムを設け、また、親_idみたいな名前のカラムで抽象側とのつながりを表現する。

よくわかんないけど、基本的にSTIよりもこっちの方がネットで推されていた。それは直感性や、STIがNULL許容的なつくりだから、だと思われる。

個人的にも、過度なDRYは好きでないので、CTIの方が好きかも。

https://qiita.com/gakinchoy7/items/9b6857558c31574fc489

りんだりんだ

CTIを選んだ場合はdelegeteを使うとよい

Userが具象クラス、Customerが抽象クラスだとして、Customerが持ってるモデルやメソッドにアクセスしたいときに、user.customer.hogehogeとなるのは読んでてどゆこと?を少し生みやすくなり、若干可読性を下げる。

なので、こういう感じでdelegateを使って、hogehogeにアクセスしたいときはcustomerを省略できるようにしておくのがよい。

delegate :hogehoge, to: :customer

https://iwsksky.hatenablog.com/entry/2018/09/23/152957