WebookWeb業界で働いています。Railsを中心にプログラミングや事業開発のようなことを書いていきます。単一継承テーブル)を行うことができます。テーブルにtype(string)カラムを持たせるそのテーブルに対応するモデルクラスを継承したクラスを作成する例えば、本(Book)とコンピューター(Computer)の商品を扱っており、一部カラムが同じで一部カラムが違うので、次のように1つのテーブルを使い、3つのモデルを作成することで、Rails側でbooksテーブルとcomputersテーブルが存在しているようにBookオブジェクトとComputerオブジェクトを扱うことができるようになります。レコードのみproductsテーブルから取得といったように、コンピューターと本のすべての商品を透過的に取り扱うことができる本だけ、コンピューターだけといったそれぞれのモデルだけで取り扱いもできるといったようにできます。Railsプロジェクトの作成Railsプロジェクトの作成する。sti_testGeneratorでProduct、Maker、Cpu、Authorを作成し、マイグレートする。db:migrate初期データを作成する。}そして、初期データを投入する。db:seed各モデルにリレーションとバリデーション定義を追加する。trueendこれで、一通りの準備ができました。STIの実装では、STIを実装していきます。productsテーブルにtypeカラムを追加します。Computerオブジェクトを取得する場合にtypeカラムを検索条件として使うので、インデックスをつけておきます。endendマイグレートを実行します。db:migrateそして、バリデーションも追加しておきます。trueend次に、Productモデルを継承したBookモデルとComputerモデルを作成します。ついでに、バリデーションも追加しておきます。trueendこれで、Railsにより自動的にSTIが行われるようになります。挙動をコンソールで確認してみましょう。STIに合わせてコントローラー、ビュー、ルーティングを修正まずは、ビューから表示内容を微調整していきます。一覧画面はidではなく、名前(name)を表示するように修正します。authorなど)がnilの場合、nilが返されるので、メソッドが定義されていないといった例外が発生しないようにできます。%>詳細画面もidではなく、名前(name)を表示するように修正します。%>次に、新規/編集画面で、メーカー、CPU、著者をテキストフィールドからセレクトボックスに変更します。:productオプションを追加します。これは、@productの中身がBookオブジェクトやComputerオブジェクトになる可能性があり、その場合、name属性の値がbook[name]やcomputer[name]などになり、コントローラーのStrongParametersの箇所でエラーになってしまいます。そのため、@productの中身に関係なくname属性をproduct[name]とするようにするために必要です。%>フォームにタイプ(type)フィールドを追加したので、コントローラーのStrongParametersにもタイプ(type)を追加します。end最後に、ルーティングを設定します。Bookオブジェクト、Computerオブジェクトの際には、books_pathやcomputers_pathに遷移しようとするのでルーティングも追記しておきます。routesで設定を確認してみます。どのURIパターンでも、productsコントローラーが呼ばれるようなルーティングの設定になっています。服、家具などサブクラスの数が増えたり、サブクラスごとにコントローラーの処理やビューの表示を変えたい場合は、別々のコントローラー/ビューを用意するといいでしょう。大きく異なる場合は、そもそもサブクラス化する必要があるのか、別々のテーブル、モデルにするべきかもしれないことを検討するべきだと思います。本番ではJSを使ったり、条件分岐を使って、表示内容を変えると良いと思います。STIで各モデルに各々の処理をさせるせっかく、STIにしたので、ProductをBook、Computerを意識しないで透過的に扱えるようにしたいですね。したい場合は、次のように各サブクラスに同じ名前のメソッドを定義してあげればよいです。BookやComputerオブジェクトに合わせた商品名を表示するメソッド(full_name)を定義してみます。endendそして、一覧画面からこのメソッドを呼び出すように修正します。%>では、画面を確認してみましょう。Book、Computerに合わせた商品名が表示されていることがわかると思います。このようにして、RailsのSTIを使うことで、DBのテーブルを1つのままで、モデルの継承関係を扱うことができます。Helper)のまとめRailsのセレクトボックス(select)、チェックボックス(check_box...2015-01-01RSpec/Capybara/Capybara-Webkitの導入方法RSpecの基本について理解している人を対象に、「RSpecのテスト...2014-12-23RailsでURLにモデルのID以外の値を表示するTipsRailsでURLにモデルのID以外の値を表示するTipsを説明します。アクセス月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。