1

私はレールの初心者で、次のようなことを行う方法を知りたいです:

私は 2 つの主要なユーザー グループを持つアプリを作成しています。それらを顧客とベンダーと呼びましょう。

これらの類似点と相違点を念頭に置いて、これをどのように実装する必要がありますか:

違い:

  • ビジネスの観点からは、これら 2 つのグループは別個のものであり、一般に、顧客はベンダーから購入されます。
  • それらは主に異なるモデルに関連付けられており、ベンダーは 90% の時間でアプリのバックエンドを使用し、顧客はフロントエンドのみを使用します。
  • ユーザーアカウント管理エージェントはかなり異なります

類似点:

  • 両方について、ロールベースの承認ソリューションを使用したいと思います (例:宣言型承認)
  • 二人ともログイン
  • 両方が同じコントローラー/ビューを介して同じモデルと対話するまれな状況があります

シンプルさとクリーンさを同時に保つための最良のソリューションは何ですか? 顧客のモデルとベンダーのモデルの両方に関連付けられた 1 つの太った User モデル? 重複したログイン ロジックを使用してモデルを分離しますか (宣言型承認ではどのように機能しますか)? 単一テーブルの継承 (ここでも宣言型承認はどうですか)?

4

2 に答える 2

2

User承認など、システムのすべてのユーザーが持つその他の基本的な機能を処理するクラスを作成します。次に、独自のビジネス ロジックを継承して持つ個別CustomerVendorクラスを作成します。UserRails の STI を使用すると、非常に簡単になります。type列を作成すると、クラス名が自動的に入力されます。

CanCanのような gem を使用して、各タイプの権限を分離できますUser

于 2012-04-23T20:49:54.953 に答える
1

OK、仕事で StackOverflow の休憩を取っていたところ、仕事に呼ばれたので、すぐに返信しました。STI を使用するかどうかを決定する必要があります。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |table|
      table.string   "type"
...

Vendor および Customer オブジェクトのインスタンスを users テーブルに保存するか、単純な複数テーブル継承を使用します。

class Vendor < ActiveRecord::Base
  belongs_to :user
...
class Customer < ActiveRecord::Base
  belongs_to :user
...

ベンダーの販売担当者や顧客の購入履歴など、ベンダーおよび/または顧客オブジェクトに固有の状態データがある場合は、MTI が必要になります。OK、購入履歴は、belongs_to :customer の他のテーブルへの結合である可能性がありますが、結合されたレコードを belongs_to :user にするのは厄介に思えるかもしれません。

さて、アクセス制御に結び付けるために、... access_control_items テーブルを実装しました。

class CreateAccessControlItems < ActiveRecord::Migration
  def change
    create_table "access_control_items", :force => true do |table|
      table.timestamps
      table.string   "controller"
      table.string   "action"
      table.string   "group_type", :null => false
      table.integer  "group_id",   :null => false
    end
  end
end

重要なことは、ロールのメンバーシップをアクセス制御から分離し、ポリモーフィックにしたことです。これにより、include?(user) メソッドを使用して任意のオブジェクトのメンバーシップになる可能性があります。メソッドが現在ログインしているユーザーをインクルードに送信する前に、私のアプリケーションコントローラーは? コントローラーとアクションに一致する任意の access_control_items によって参照されるグループのメソッド。

したがって、グループは ActiveRecord クラスのインスタンスを指すことができます。そのクラスは、ユーザーがベンダー (STI で type = "Vendor" を持っているか、nil 以外の has_one :vendor を持っている) の場合、include?(user) に true を返すクラスである可能性があります。 MTIで)。

実際には、必要に応じて gem や cancan を使用してください。ただし、独自のアプリケーション ロジックの設計を切り離す例を考えてみましょう。

于 2012-04-24T14:24:47.440 に答える