0

私は、最初の Ruby On Rails アプリ (ゲーテッド レジデンシャル コミュニティの Web サイト) を作成しています。

コミュニティ エリアは空き区画で構成され、1 つまたは複数の家が建てられた区画にあります。区画の所有者は 1 人だけですが、区画内の複数の家屋はそれぞれ異なる所有者を持つことができます。さまざまな役割を持つ選出された事務所の担い手 (自治会) やプロパティ管理スタッフなどがあります。最終的には、ユーザー グループ (所有者のみ、テナントのみ、または混合など) が存在します。

所有者とテナントはかなり異なる傾向があるため、別のクラスとして保持しています。同様に、そのファミリー メンバーも異なる傾向があります (OwnerFamilyMember クラスと TenantFamilyMember クラス)。

私の最初の設計は、単一のユーザーとロール、および割り当てモデルを持つことでした。ロールが多すぎました。したがって、上記のようにユーザー モデルを分割します (STI やポリモーフィック アソシエーションを使用したくないので、最初に正しく取得したいと思います)。

モデル クラス:

# All classes below inherit from ActiveRecord::Base, removed other attributes for compactness

class Owner
    has_many :plots    
    has_many :houses   
    has_many :owner_family_members    
end

class Tenant
    belongs_to :house    # declare house_id in table
    has_many :tenant_family_members
end

class Staff ...

class Plot
    belongs_to :owner    # declare owner_id in table
end

class House
    belongs_to :owner    # declare owner_id in table
end

class OwnerFamilyMember
    belongs_to :owner    #  declare owner_id in table
end
class TenantFamilyMember
    belongs_to :tenant    #  declare tenant_id in table
end
  • テナントまたは所有者は家に住んでいます。
  • オーナーまたはテナントの家族メンバーはコミュニティに参加しますが、特定の特権アクションについてはプライマリ オーナーまたはテナントに依存しています

この設計では、さまざまなユーザー モデルに暗黙の役割があり、必要に応じて追加のサブ役割を持つことができることを理解しています。所有者は住民協会の会計担当者になることができ、テナントは水保全グループを率いることができます。役割はさらに進化するため、複数の User モデルを保持する方がよいと思います。

私は正しい軌道に乗っていますか?このレシピで間違ったことを混同していませんか? これをよりよく理解するのに役立つフィードバック、概念または実装固有のフィードバックを熱心に聞いてください。

私はデータベースの概念、OO プログラミングを理解していますが、本番レベルのデータベース設計または RoR アプリケーションの初心者です。この長い投稿を読んでくれてありがとう。- ジャヤワント

4

1 に答える 1

0

Railsコミュニティへようこそ!あなたはここでそれを気に入るはずです。

まず第一に、STI やポリモーフィックな関連付けをためらう必要はありません。これらは Rails の世界では非常に価値のあるツールです。ユーザー/ロール/割り当て (結合テーブル) 戦略は、適切な正規化された認証とロールベースの承認アプローチに対処するのに妥当なようです。User モデルをアプリケーションの他のロジックからかなり分離し、Ryan Bates のCanCanライブラリを使用して承認を処理し、Plataforma のDeviseライブラリを介して認証します。

これで、さまざまな User/Admin/GuyWhoAuthenticates モデルにまったく依存しない、優れた認証/承認のセットアップができ、アプリケーションははるかにシンプルになりました。元:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    ...
    if user.has_role? 'plot_owner'
      can :manage, Plot, user_id: user.id
    end
    ...
  end
end

class User < ActiveRecord::Base

  has_many :assignments
  has_many :roles, through: :assignments

  ...

  def has_role? role
    roles.where(label: role)
  end    

  ...

end

他のモデルに関しては、大雑把に言うと、どの程度のロジックを共有しているか? それらが同じ属性を持ち、かなりの量のアプリケーション ロジックを共有し、概念的に類似している場合 (家族の一員であるなど)、STI / ポリモーフィック アソシエーションを使用します。そうでない場合は、共通のロジックを別のモジュールに抽出して、両方のモデルに含めることができます。

あなたは Rails の世界に慣れていないので、 RailscastsPeepcodeをチェックすることを強くお勧めします。この 2 つの素晴らしいスクリーンキャスト サイトを使用すると、すぐに Rails アプリケーションをボスのように作成できます :D

乾杯!

于 2013-01-18T18:44:25.610 に答える