お問い合わせ
ページのイメージ
WEB開発 2017/07/05
rails

[Rails]多対多モデルを利用しているビューのプレビュー実装について

  •  

rails

この頃、急に暑くなってきたせいか、蝉の鳴き声の幻聴が聞こえはじめた榊原です。

今回もVue.jsについて書こうかなと思いましたが、これは展開しておこうというものがあったので、Vue.jsのことではなく、Railsのことを書きます。
では、その内容はというと、タイトル通り「多対多モデルを利用しているビューのプレビューの実装」についてです。

サンプルモデル

早速本題となっていきますが、リレーションの記述については、他に色々な方たちがもっと詳しく説明してくれているので、今回は省略します。
今回説明用のモデルは以下の通りに設定されているものとします。

CompanyモデルがEventモデルと一対多の関係
CompanyモデルとCategoryモデルがCategoriesCompaniesモデルを中間モデルとして、多対多の関係となります

Companyモデル

  1. class Company < ApplicationRecord
  2. has_many: :events
  3. has_many: :categories, through: :categories_companies
  4. has_many: :categories_companies, dependent: :destroy, inverse_of: :company
  5. end

Eventモデル

  1. class Event < ApplicationRecord
  2. belongs_to: :company
  3. end

Categoryモデル

  1. class Category < ApplicationRecord
  2. has_many: :companies, through: :categories_companies
  3. has_many: :categories_companies, dependent: :destroy, inverse_of: :category
  4. end

CategoriesCompaniesモデル

  1. class CategoriesCompanies
  2. belongs_to :category
  3. belongs_to :company
  4. end

サンプルコントローラー

書き忘れてましたが前提として、ビューは通常とプレビューのものは同一のもので、かつ、保存しなくてもプレビューが見れる実装とします。

下記コントローラーの12〜14行目が今回の内容のキモで、疑似的に中間モデルにデータがあるときと同じ状態にします。

軽く説明すると、中間モデルにデータはないですが、Categoryモデルにはデータが存在しているので、直接Categoryモデルのデータを取得して、かつ、適した形にしてbuildメソッドを引き渡すことで、中間モデルにデータがある状態と同様の動作してくれるようになります。
ちなみに一体多や一体一の関係にあるモデルに関しては、モデルにしっかりリレーションが設定していなければ、保存をしていなくても、保存時と同じ参照の仕方で問題ありません。

  1. class ComapnyController < ActionController::Base
  2. # 通常
  3. def index
  4. @company = Company.includes(:event, :categories)
  5. end
  6.  
  7. # プレビュー
  8. def preview
  9. @company = Company.new(params.require(:categories).permit(...))
  10.  
  11. # 多対多のリレーションを疑似的に生成
  12. @company.categories.build(
  13. Category.where(id: attr[:category_ids]).map { |val| val.attributes }
  14. )
  15.  
  16. render action: :index
  17. end
  18. end

サンプルビュー

ビューの内容に関しては特に説明する内容はないのですが、なぜ、通常とプレビューで同一のビューにするかというと、ビューを分けた方が実装的には簡単になりますが、その後の改修を行う際、ビューが2つになるので、改修コストがかかるのと、また、改修漏れが発生するリスクがあるためです。

  1. <ul>
  2. <%- @company.events do |event| %>
  3. <li><%- event.event_name %></li>
  4. <%- end %>
  5. </ul>
  6.  
  7. <ul>
  8. <%- @company.categories. do |category| %>
  9. <li><%- category.category_name %></li>
  10. <%- end %>
  11. </ul>

まとめ

railsを触り始めてから2年ぐらいになりますが、まだまだ日々書くコードが変わるほど奥が深いです。
また、リリースされた5.1で、webpack等も正式に対応されてフロント側との連携もしやすくなったので、そちらも触っていきたいと思います。
本当にrailsは痒いところに手が届くフレームワークだと思うので、すこしでも興味ある方は触ってみてください。

今回はサーバーサイドの内容だったので、次回はフロントサイドの内容でもと考えています。


しずおかオンライン中途採用社員も、積極募集中!
しずおかオンラインののスタッフとして、地域の魅力を伝える仕事です。
くわしくはこちら!

※「イエタテ」は2023年4月より㈱くふう住まいにて運営しています

Category

Ranking