Ruby On Rails-Benutzermodell für mehrere Typen
Ich lerne RoR aus vielen Jahren von C # und MSSQL.
Ich habe ein Projekt ausgewählt, um eine Website für meinen Bruder zu erstellen, der Vermieter ist. Ich dachte, dass dies ziemlich einfach sein sollte, da die Modelle geradlinig sein sollten, aber es könnte sein, dass ich über alles nachdenke oder Probleme habe, den "alten" Weg zu verlassen. Jedenfalls ist hier das Problem. Ich beginne mit nur zwei Modellen (Benutzer und Eigentum). Das Immobilienmodell ist einfach, der Benutzer nicht so sehr. Ich stellte fest, dass wir drei Arten von Benutzern im System haben. Mieter, Eigentümer und Verwalter (mein Bruder wird der einzige Verwalter sein, aber ich dachte, ich würde es so gestalten, dass es wächst) Er verwaltet Immobilien für mehrere Eigentümer, von denen jeder viele besitzen kann. Jede Immobilie wird einen Eigentümer, einen Mieter und eine Krippe haben.
Tenants können sich einloggen und sehen nur die Immobilie, die sie mieten, um vielleicht eine Wartungsanfrage oder ähnliches auszufüllen. (Zum jetzigen Zeitpunkt ist es nicht wirklich erforderlich, dem Mieter ein Login für das System zu geben, aber ich dachte, es wäre eine gute Übung
Das Gleiche gilt für Besitzer. Keiner von ihnen benötigt wirklich Zugriff auf das System (sie stellen meinen Bruder ein, damit sie nicht involviert werden müssen), aber ich dachte, dass es nett und wieder eine gute Übung sein könnte.
Ich habe den Nifty_generator verwendet, um einen Benutzer zu generieren, der nur E-Mail, Passwort usw. angibt. Ich habe ihn wie folgt erweitert ...
class AddProfileDataToUsers < ActiveRecord::Migration
def self.up
add_column :users, :first_name, :string
add_column :users, :last_name, :string
add_column :users, :address1, :string
add_column :users, :address2, :string
add_column :users, :city,:string
add_column :users, :state, :string
add_column :users, :zip, :string
add_column :users, :phone, :string
add_column :users, :email, :string
add_column :users, :user_type, integer
end
def self.down
remove_column :users, :first_name
remove_column :users, :last_name
remove_column :users, :address1
remove_column :users, :address2
remove_column :users, :city
remove_column :users, :state
remove_column :users, :zip
remove_column :users, :phone
remove_column :users, :email
remove_column :users, :user_type
end
end
Hier ist der Code zum Erstellen der Eigenschaftstabelle
class CreateProperties < ActiveRecord::Migration
def self.up
create_table :properties do |t|
t.string :address
t.string :city
t.string :type
t.integer :beds
t.float :baths
t.float :price
t.float :deposit
t.string :terms
t.string :laundry
t.datetime :date_available
t.integer :sqft
t.integer :owner_id
t.integer :manager_id
t.integer :tenant_id
t.timestamps
end
end
def self.down
drop_table :properties
end
end
Ich habe das folgende Benutzermodell zum Benutzermodell hinzugefügt, das vom nifty_authentication-Generator generiert wurde.
class User < ActiveRecord::Base
#other stuff in the user model up here......
validates_length_of :password, :minimum => 4, :allow_blank => true
#this is the stuff that I have added to the user model
has_many :managed_properties, :class_name => "Property", :foreign_key => "manager_id"
has_many :owned_properties, :class_name => "Property", :foreign_key => "owner_id"
has_one :rented_property, :class_name => "Property", :foreign_key => "tenant_id"
Ich habe dies dann zum Eigenschaftsmodell hinzugefügt ....
class Property < ActiveRecord::Base
belongs_to :manager, :class_name => "User" #picked up by the manager_id
belongs_to :owner, :class_name => "User" #picked up by the owner_id
belongs_to :tenant, :class_name => "User" #picked up by the tenant_id
end
Meine Frage ist, sieht dies nach einer akzeptablen Methode aus, um die von mir beschriebene Situation zu modellieren?
Sollte ich die Vererbung einer einzelnen Tabelle verwenden und ein Mandantenmodell erstellen? ein Managermodell; und ein Besitzermodell? Das Problem dabei war, dass ein einzelner Benutzer sowohl Manager als auch Eigentümer sein konnte. Dies könnte gelöst werden, indem dann eine Rollentabelle für den Benutzer vorhanden ist, in der ein Benutzer viele Rollen und eine Rolle viele Benutzer hat. Ich hatte mir auch eine Profiltabelle mit einer Eins-zu-Eins-Übereinstimmung mit der Benutzertabelle angesehen und diese polymorph gemacht, aber ich dachte nicht, dass diese Situation dies wirklich erfordert, und sie löste nicht das Problem, bei dem ein Benutzer Eigentümer sein kann und ein Manager .....
Dies ist, als ich anfing zu denken, dass ich vielleicht über das Problem nachgedacht habe und auf das gekommen bin, was Sie hier sehen.
Ich freue mich über konstruktive Kommentare. Bitte denken Sie daran, dass ich noch nie etwas in Rails eingebaut habe und dies alles ein erster Versuch ist. Vor einer Woche hatte ich noch nie Schienen auf meinem Computer installiert.
Ich weiß nicht, ob dies von Bedeutung ist, aber ich habe mir gedacht, dass der Administrator / Manager für die Erstellung der Benutzer verantwortlich ist. Dies ist keine selbstregistrierte Site. Der Manager fügt neue Eigentümer hinzu, wenn er einen neuen Eigentümer anmeldet, und das Gleiche gilt für Mieter. Dies erleichtert die Ermittlung des Benutzertyps, den er erstellt.
Vielen Dank für Ihre Erkenntnisse.