2010-12-29 8 views
8

私は、管理者、従業員、製造元、運送業者の4種類のユーザタイプを持つ在庫管理アプリケーションを構築しています。次のように製品と多対多の関連を通して:私はまだコーディング開始していないが、これは私が考えているものです。..メーカーとトランスポーターはhas_manyのと関連しているRuby on Railsにおける複数のユーザ役割

class Manufacturer < ActiveRecord::Base 
has_many :products 
has_many :transporters, :through => :products 
end 

class Product < ActiveRecord::Base 
belongs_to :manufacturer 
belongs_to :transporter 
end 

class Transporter < ActiveRecord::Base 
has_many :products 
has_many :manufacturers, :through => :products 
end 

すべての4つのユーザタイプがしますログインすることができますが、彼らは異なるアクセス許可やビューなどを持っています。私は同じテーブル(ユーザー)に置くことはできません、しかし、彼らは異なる要件を持っているので、つまり:ベンダーとメーカーは、請求先住所と連絡先情報(検証による)がありますが、管理者と従業員はこれらのフィールドを持つべきではありません。

可能であれば、私は4つの異なる画面ではなく、1つのログイン画面を持っていたいと思います。

私はこれを構築するための正確なコードを要求していませんが、それを実現させる最善の方法を決定することに問題があります。どんなアイディアも大歓迎です - ありがとう!

答えて

5

あなたの基本的なアプローチは、合理的なようだを参照するようにします。ユーザーの基本クラスを作成して、特定のユーザータイプにSTIを使用することをお勧めします。たとえば、

...など。このように、タイプに関係なく複数のユーザータイプを1つの関係に集約する必要がある場合は、一般的にユーザーを記述する1つのテーブルがあります。これはかなり一般的なアプローチです。

異なるユーザーがシステムにどの程度アクセスするかによって、Declarative Authorizationのような役割管理の宝石を見ることができます。

+0

助けてくれてありがとう!これに対して、どのようにデータベーステーブルを設定し、特定のユーザータイプの基本クラスUserおよびSTIを使用しますか?私は本当に、本当に、レールに新しいです:) – aguynamedloren

+0

あなたはデータベース内に 'users'テーブルしか持っていません。 STI /単一表継承は、基本表(この場合は「ユーザー」)の「タイプ」フィールドを使用して、基本クラスのサブタイプを区別します。移行でこのフィールドを追加する必要があります。その後、基本クラスのすべてのサブタイプのすべての属性は、たとえ特定のインスタンス/行によって使用されなくても、users表に保持されます。これは、STIパターンを使用した場合のトレードオフです。サブタイプ固有の属性の数に応じて、使用されていない属性のヌルフィールドがいくつかある場合があります。 –

1

Userモデル、Addressモデル、ContactInfoモデルなどを作成することをお勧めします。ユーザーモデルには、こうした種類のフィールドを置いてはいけません。データベースを正規化します。他のクラスのそれぞれにFKをUser.idに持っています。あなたが別のそれらを保つ必要がある場合は

、その後、ログインを正常化し、それが多型その所有者(製造者、従業員、など)

+0

Weeeelll ...多分。アドレステーブルを持つことは確かに標準化されていますが、現実世界では何度も過度の攻撃を受けています。実際には、ハードコアの正規化フリークは、ほとんどの場合、 varcharフィールドよりも、発生するすべてのオーバーヘッドを持つ独自のテーブルに正規化する必要はありません。これまでのユーザークエリでSQL結合ヒットが本当に必要ですか?このような簡単な操作ではあまり効果がありません。ドメインは本当に複雑で再利用可能かどうかは、ドメインに依存します。 –

+0

@Dave Sims - 私は完全に正直に反対します。今日の世界では、可能な限り多くの情報が必要です。正規化(特にアドレスを含む)は将来の拡張を可能にします。ユーザーが複数のアドレス(家や仕事など)を持つことができます。また、SELECT *が10個の列を返すかJOINが10個の列を返すかは問題ではありません(オーバーヘッドは信じられないほど大きなデータセットでは意味がありません)。さらに、ユーザーには常にアドレスを表示するわけではないので、なぜユーザーテーブルに表示されますか?これは別のオブジェクトです – sethvargo

+0

@Dave Sims - (con't)。私はそれをこのように見る。私は名字を持っています、私は姓を持っています。私も住所があります。私は、address_line_1とaddress_line_2、zip ...はありません。addressは、address_line_1、2..zipなどです。私にとって、これらのことを分かち合うことは、ちょうどもっと意味があります。アドレスのないユーザーがいますか?誰かがホームレスの場合、あなたのサイトへのアクセスを本当に制限したいですか?私はトップになっていますが、なぜノーマライゼーションが重要であるかがわかります。 – sethvargo

4

複数のユーザーシステムでは、一般的には、ロールモデルまたはSTIを使用するのが一般的です。ユーザーが複数のロールを同時に持つことができる場合(たとえば、単一ユーザーが製造者と運送業者のように)、ロールベースシステムが良い解決策になります。ユーザーの役割が固定されている場合は、STIに行ってください。

関連する問題