Estoy aprendiendo RoR viniendo de muchos años de C# y MSSQL.Ruby On Rails Modelo de usuario para múltiples tipos
Escogí un proyecto para construir un sitio web para mi hermano, que es administrador de la propiedad de alquiler. Pensé que esto debería ser bastante fácil ya que las modelos deberían ser sencillas, pero creo que podría estar pensando demasiado o estoy teniendo problemas para dejar de lado el "viejo" camino. De todos modos aquí está el problema. Estoy empezando con solo dos modelos (Usuario y Propiedad). El modelo de propiedad es fácil, el usuario no tanto. Pensé que tenemos tres tipos de usuarios en el sistema. Inquilinos, propietarios y gerentes (mi hermano será el único administrador, pero pensé que lo diseñaría para que creciera) Gestiona propiedades para varios propietarios, cada uno de los cuales puede poseer muchas propiedades. Cada propiedad tendrá un propietario, un inquilino y un gerente.
Los inquilinos podrán iniciar sesión y simplemente ver la propiedad que alquilan para completar una solicitud de mantenimiento o algo por el estilo ... (en este momento no es necesario siquiera dar al inquilino acceso al sistema pero creo que sería un buen ejercicio)
Lo mismo ocurre con los propietarios, ninguno de ellos realmente necesita acceso al sistema (contratan a mi hermano para que no tengan que participar) pero pensé que podría ser bueno y de nuevo una buen ejercicio.
He utilizado el Nifty_generator para generar un usuario, que apenas da de correo electrónico, contraseña, etc. He ampliado de la siguiente manera ...
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
Este es el código para crear la tabla Propiedades
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
Agregué lo siguiente al modelo de usuario que fue generado por el generador nifty_authentication
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"
Luego añade esto al modelo de propiedad ....
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
Mi pregunta es, ¿Esto parece una forma aceptable de modelar la situación que he descrito?
¿Debo utilizar la herencia de tabla única y crear un modelo de inquilino? un modelo de gerente; y un modelo de propietario? El problema que vi al hacer eso fue que un solo usuario podría ser tanto un gerente como un propietario. Esto podría resolverse teniendo en ese momento una tabla de roles para el usuario donde un usuario tenga muchos roles y un rol que tenga muchos usuarios. También miré una tabla de perfil con una coincidencia uno a uno con la tabla de usuarios y la hice polimórfica, pero no pensé que esta situación realmente lo requiera y no resolvió el problema de que un usuario puede ser propietario. y un gerente .....
Esto es cuando empecé a pensar que tal vez estaba pensando demasiado en el problema y se me ocurrió lo que ves aquí.
Acepto cualquier comentario constructivo que pueda tener. Tenga en cuenta que nunca construí nada en Rails y esto es todo un primer intento, hace una semana ni siquiera instalé los rieles en mi computadora.
No sé si esto importa pero pensé que el administrador/administrador sería responsable de crear usuarios. Este no será un tipo de sitio de autoinscripción. El gerente agregará nuevos propietarios cuando firme un nuevo propietario, y lo mismo aplicará a los inquilinos. Esto hará que sea más fácil determinar el tipo de usuario que está creando.
Gracias por cualquier idea que pueda tener.
+1 decl_auth se ve bien! – SingleNegationElimination