🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1722閲覧

【Rails】クックパッド料理教室のようなモデル関連付け

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

2クリップ

投稿2017/06/27 00:58

編集2017/06/27 01:05

要件とお願い

クックパッド料理教室のような関連付けを考えています。
Airbnb「体験」サービスにも似ていると思います。
現状の関連付けに対する助言をお願いします

仕様と現状

仕様内容
まとめ1ある 「団体(Host)」ある日程 で催す Event「User」参加 できるサービス。
詳細1ある 「団体(Host)」複数のEvent をもつ。
詳細2個々のEvent は、更に 複数の開催日時 を持つ。
詳細3個々の開催日時 は、 複数の参加者(User) を持つ。

現状のモデル一覧(命名に関しても助言頂ければ)

モデル名内容
Hostイベントを開催する団体
EventHostが計画するイベント
EventDateEventが催される日程
EntryUserとEventDateを多対多の関係にし、参加機能を実装
Userユーザ

モデル関連付け

class Host < ApplicationRecord has_many :events end
class Event < ApplicationRecord belongs_to :host has_many :event_dates end
class EventDate < ApplicationRecord belongs_to :event has_many :entries has_many :users,through: :entries end
class Entry < ApplicationRecord belongs_to :event_date belongs_to :user end
class User < ApplicationRecord has_many :entries has_many :event_dates,through: :entries end

参考

参考画像
※Relationshipは本件と関係ありません
※マイグレーションはまだ全て行っておりません。

課題点・気がかり

User参加イベントの、主催団体名(つまりホスト名)を取得するのに、
User → EntryDate → Event → Host みたく、長く辿る必要があるのも気がかりですし、
そもそもベストなのか もわかりません。助言をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なにがベストなのかはUIの設計によります。
リンク先のサイトを見る限りは、これで十分じゃないかなと思います。
リンク画像をどうするかは考える余地がありますが…。

User → EntryDate → Event → Host みたく、長く辿る必要があるのも気がかりです
長くなっても、最新のDBを利用して、適切なindexを貼れば、それほど速度低下も起きませんし

ruby

1class User < ApplicationRecord 2 has_many :entries 3 has_many :event_dates,through: :entries 4 has_many :events,through: :event_dates 5 has_many :hosts,through: :events 6end

とすればSQL文自体は長いけれどもRails上は短くできます。

もしどうしても速度低下に悩まされる場合、新たなrelationshipを作らずに
entrieにhost_idを持たせるのがいいと思います。

Railsは、delegateなどを使い、modelのmethod名を適切に設定しておけば、後から、モデルの親子関係が変更になってもほとんど修正する必要がありません。

現在のシステムのベストはUIに依存すると言っても過言ではありません。
そしてUIのトレンドは目まぐるしく変化します。
とりあえず、ベターでせめて、運用しながらベストを見つけれるのがRails流です。

余談ですがRails5.1から仮想DOMライブラリreact.js等が簡単に組み込めるようになりました。
学習コストはかかりますが、Railsの苦手分野が補完されていますので余力があれば試して見るといいですよ。
個人的にはvue.jsがおすすめです。

投稿2017/06/27 04:34

編集2017/06/27 04:46
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/28 23:06

ありがとうございました! mokeさんのご回答のおかげで安心しました。 react.jsやvue.jsも書籍等で確認し、学びます!
moke

2017/06/29 04:24 編集

vueは去年の10月に2.0が出たばかりなので多分日本語の書籍はないですよ でも日本語のドキュメントが充実しているので大丈夫でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問