0

簡単な説明:

1 つのアプリに複数の Devise モデルを実装する際に、アーキテクチャに関するアドバイスと支援を求めています。

より詳細な説明:

私のアプリケーションは、次の動作を実行する必要があります。

3 種類のユーザー ( PartnerAttendeeSpeaker) があり、いくつかの共通フィールドといくつかの固有フィールドがあります (また、フィールドには異なる権限がある場合があります。つまり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です。Partnerrails consoleUser

しかし、可能なすべてのフィールドをモデルに追加した場合、Userフィールドの存在をどのように検証するのでしょうか?


私はここSOに関するかなりの数の記事と質問を読みましたが、それでもそれらすべてを実装する方法について頭を悩ませることはできません.

とにかく、それは私が必要とすることを行う正しい方法ですか?

この種の動作と機能を最初から最後まで実装する方法と、モデルを実装した後にモデルを操作する方法を詳しく説明してくれる人はいますか?

PS: これが私の移行の歴史とgithub リポジトリ全体です


アップデート

役割の分離だけを行うのを妨げた別の問題を思い出しました。

異なるユーザーを異なるサインアップ フォームでサインアップするにはどうすればよいですか? 異なるルート?ユーザーにコンボボックスから役割を選択させることはできません。

4

1 に答える 1