0

私は今、アプリケーションの設計段階にあります。ほとんどの場合、アプリケーション モデルの洞察を得たり、必要なものを定義したりするために紙の上で作業を行っています。そして、解決方法がわからない、またはより具体的には、それをドライに保つために実装する方法がわからないという問題が1つ見つかりました。だからここに契約があります:

私は3つの異なるタイプのユーザー/アカウントになるアプリケーションを持っています:

  1. 通常のアカウント- アカウントには、アプリケーションで基本的な権限を持つ基本的なプロファイルがあり、通常のアカウントを持つユーザーは、全員の公開プロファイルを表示したり、自分のプロファイルを変更したり、プロファイル写真を 1 つだけ持つことができたり、検索したりできます。

  2. 高度なアカウント- 高度なプロファイルがあります。つまり、ユーザーは連絡先情報、外観の詳細を指定でき、予約ページを持ち、オファーを取得でき、カレンダーを持つことができます

  3. 企業アカウント- 企業の連絡先情報を含む企業プロファイルがあり、上級ユーザーにオファーを作成したり、アプリケーション内のすべてのプロファイルを参照したりできます

したがって、基本的に、すべてのユーザーに対して 1 つのユーザー モデルをまとめて使用し、認証には Devise を使用することにしました。ユーザーが作成された後、レギュラー、アドバンスト、カンパニーのアカウントタイプを選択できる画面を表示したいと思います。その後、システム内の適切な権限と適切なプロファイルが付与されます。今後、アカウントの種類を変更することはできません。

また、コードをクリーンでドライに保ちたいのですが、最適なソリューションを見つけるのに非常に苦労しています。そして今、頭を壁にぶつけています。なぜなら、やり方が分からないからです。質問は次のとおりです。

このための最終的なモデル ダイアグラムはどのように見えるでしょうか。それは多形的な関連であるべきですか?または、一般的なものにする必要があります。

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :account_type

  has_one :account
  has_one :entertainer
  has_one :company
  after_create :create_account

  def create_account
    if self.account_type == 'Advanced'
      self.entertainer = AdvancedAccount.create(user_id: self.id)
    elsif self.account_type = "Company"
      self.company = CompanyAccount.create(user_id: self.id)
    else
      self.account = RegularAccount.create(user_id: self.id)
    end   
  end
end

または、私は完全に間違った道を進んでいますか?この問題のベストプラクティスは何ですか? アドバイスありがとうございます!

4

2 に答える 2

2

ユーザーのタイプごとに個別のモデルを管理する代わりに、cancan gem がユーザーの能力と承認を管理するのに非常に役立つことがわかりました。過去にこのブログ投稿を使用してdeviseでセットアップしましたが、今ではかなり古くなっている可能性があります.

于 2013-03-17T03:56:48.467 に答える
0

UsersController 内でいくつかのメソッドを使用して、さまざまなアクセス レベルを定義します。次に例を示します。

@user = is_advanced?

このようにして、所有するアカウントの種類を選択し、その選択をデータベースに保存できるようにすることができます[users::account_type: integer]。これにより、その機能を追加することにした場合に、将来変更できるようになります。

Users クラスにそれほど多くのアソシエーションを作成することはありません。RESTfull ルートなどを肥大化させ、その後のデバッグを悪夢にするからです。

于 2013-03-17T03:56:22.527 に答える