これがすでに回答されている場合はご容赦ください。しかし、私はたくさん検索しましたが、まだ説明が必要です。
Rails 3.2 を使用してプロパティ管理ツールを構築しています。私はすでに User モデルと承認/認証コードを用意しており、テストを完全にカバーしています。
モデル/クラス/テーブルを描き始めたばかりで、少し混乱しています。
ユーザーから始めましょう。
ユーザーのモデル化
複数の企業にこのシステムを利用してもらう予定です。それぞれに従業員 (ユーザー) がいます。これらのユーザーには、マネージャー、エージェント、会計士、秘書などのさまざまな役割があります。ほとんどの場合、これらのユーザーごとに保存する予定のデータは似ているため (または、現時点ではそう思います)、単一テーブルに傾いています。継承と型を使用して、各従業員が持つアクセスのレベルを定義します。
次に、家主とテナントもシステムにログインできるようにする予定です。ログインすると、所有または賃貸している物件に関する情報を表示できます。連絡先の詳細も最新の状態に保つことができます。
これらのユーザーを表現するために多態的な関連付けを使用することを考えていました。
ですから、私が現時点で持っている計画で、フィードバックが欲しいのは、
ユーザー < ActiveRecord::BASE
従業員 < ユーザー (これには STI タイプの列があり、さまざまな従業員の役割が許可されます)
家主 < ユーザー
テナント < ユーザー
これはこの問題に取り組む最善の方法ですか、それとも私は自分自身を撃っていますか?
「ロール」テーブルを用意してユーザーにロールを割り当てる必要があるとアドバイスする人もいますが、これは Rails でこれを行う最もエレガントな方法ではないと感じています。
プロパティ
私の次の問題はプロパティです。現在、プロパティのモデルがあり、それらを追加すると、それらは User に属する (つまり、user_id 外部キーを持っている)。そこで「プロパティを追加した従業員(ユーザー)が退職したり、何らかの理由でアカウントを削除したりしたらどうなるのだろう?」と考えるようになりました。
したがって、このシナリオでは、ユーザー/従業員とプロパティの関連付けをやめて、従業員が所属する会社にプロパティをリンクするだけでよいのでしょうか? このようにして、すべての employee.company.properties をすべてのプロパティを一覧表示できますか?
家主とテナントの協会
プロパティを会社に所属させると仮定しましょう。
連想に関しては、これが私の頭の中にあるものです。今見てみると、システムを使用しているある会社が別の会社の家主/テナント/従業員/財産を見ることができないため、すべてが会社に属していることがわかります。
class Landlord < User
belongs_to :company
has_many :properties, :through => :ownerships
end
class Tenant < User
belongs_to :company
has_one :property, :through => tenancies #you can only live at one place at a time right?
end
class Property < ActiveRecord::Base
has_many :tenants, :through => :tenancies
has_many :landlords, :through => :ownerships
belongs_to :company
end
class Company < ActiveRecord::Base
has_many :properties
has_many :employees
has_many :landlords :through => :ownerships #not sure if through is required/works here
has_many :tenants :through => :tenancies #not sure if through is required/works here
end
class Employees < User
belongs_to :company
end
プロパティ
また、さまざまな種類のプロパティ (商業用/住宅用) があり、それらのうち、建物全体、建物内のアパート (単一の住所) などがあると思います。
ユーザーの場合と同様に、Polymorphic Associations を使用して 2 つのサブクラス CommercialProperty と ResidentialProperty を定義し、sti を使用して型を定義することを計画しています。タイプが「マルチユニット」の場合、ユニットの新しいモデルと、プロパティが_多くのユニットを持ち、ユニットがプロパティに属するという関連付けがあります。
標的
新しい機能を追加して拡張するときに、アプリの大部分を書き直す必要がないように、コードが可能な限りベスト プラクティスに従っていることを確認しようとしています。
フィードバックをいただければ幸いです。
参照
私が読んだいくつかの投稿。うまくいけば、同じ問題を解決しようとしている他の人を助けることができます。