簡単な説明:
1 つのアプリに複数の Devise モデルを実装する際に、アーキテクチャに関するアドバイスと支援を求めています。
より詳細な説明:
私のアプリケーションは、次の動作を実行する必要があります。
3 種類のユーザー ( Partner
、Attendee
、Speaker
) があり、いくつかの共通フィールドといくつかの固有フィールドがあります (また、フィールドには異なる権限がある場合があります。つまりAttendee
、ユーザー名が必要ですが、ユーザー名がSpeaker
必要な場合もありますが、必ずしもこのフィールドに入力する必要はありません。の)。さらに、異なるユーザー モデルには、データベース内の他のテーブルとの関連付けが異なる必要があります。
ユーザーは単一のログイン フォームからログインできる必要がありますが、サインアップ フォームは異なる必要があります。
だから、私が最初に考えたのは、Pundit
またはdeclarative_authorization
または何かを使用してユーザーをロールで分割する必要があるということでしたが、ユーザーは実際にはアプリで異なるロール (つまり、アクセス許可) を持っているわけではなく、むしろ異なる動作をしており、異なるコンテンツやものを見る可能性があります。と、考え続けました。
2 つ目は STI の実装で、それに関する記事をいくつか読んだ後、コードでそれを実行しようとしました。
実行してDeviseUser
モデルを生成しrails g devise User
、その後実行rails g model Attendee
し、他の2人のユーザーについても同じことを行いました。
次に、モデルをUser
次から継承しました。
class Attendee < User
end
私User
の移行は次のようになります。
create_table :users do |t|
t.string :first_name
t.string :last_name
t.string :type
# Devise stuff ...
..................
t.timestamps null: false
end
そして、他の移行は次のようになります。
create_table :attendees do |t|
t.string :username
t.string :company_name
t.boolean :subscription
t.timestamps null: false
end
別のテーブルを作成するのが間違っていたことに今気づきました。User
可能なすべてのフィールドをテーブルに入れる必要がありましたが、それでよろしいですか? で新しいAttendee
またはを作成しようとすると、これら 3 つのモデルはすべて、モデルが持つフィールドとまったく同じフィールドを持つためSpeaker
です。Partner
rails console
User
しかし、可能なすべてのフィールドをモデルに追加した場合、User
フィールドの存在をどのように検証するのでしょうか?
私はここSOに関するかなりの数の記事と質問を読みましたが、それでもそれらすべてを実装する方法について頭を悩ませることはできません.
とにかく、それは私が必要とすることを行う正しい方法ですか?
この種の動作と機能を最初から最後まで実装する方法と、モデルを実装した後にモデルを操作する方法を詳しく説明してくれる人はいますか?
PS: これが私の移行の歴史とgithub リポジトリ全体です
アップデート
役割の分離だけを行うのを妨げた別の問題を思い出しました。
異なるユーザーを異なるサインアップ フォームでサインアップするにはどうすればよいですか? 異なるルート?ユーザーにコンボボックスから役割を選択させることはできません。