Я изучаю RoR, исходящий из многих лет С# и MSSQL.
Я выбрал проект для создания веб-сайта для моего брата, который является менеджером аренды недвижимости. Я полагал, что это должно быть довольно легко, так как модели должны быть прямолинейными, но он думает, что я, возможно, передумал все, или у меня возникли проблемы с выходом из "старого пути". Во всяком случае здесь проблема. Я начинаю с двух моделей (User и Property). Модель собственности проста, пользователь не так много. Я понял, что у нас есть три типа пользователей в системе. Арендаторы, владельцы и управляющие (мой брат будет единственным менеджером, но я решил, что я буду его разрабатывать). Он управляет свойствами нескольких владельцев, каждый из которых может владеть многими свойствами. В каждом имуществе будет один владелец, один арендатор и один ясли.
Арендаторы смогут войти в систему и просто увидеть арендуемую недвижимость, возможно, заполнить запрос на обслуживание или что-то в этом роде... (на данный момент нет реального требования, чтобы даже дать арендатору вход в систему, но я думал, что это будет быть хорошим упражнением)
То же самое происходит для владельцев, никому из них не нужен доступ к системе (они нанимают моего брата, чтобы они не были вовлечены), но я подумал, что это может быть приятно и снова хорошее упражнение.
Я использовал Nifty_generator для создания пользователя, который просто дает адрес электронной почты, пароль и т.д. Я расширил его следующим образом:
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
Вот код для создания таблицы свойств
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
Я добавил в модель пользователя, созданную генератором 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"
Затем я добавил это в модель свойств....
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
Мой вопрос в том, выглядит ли это как приемлемый способ моделирования ситуации, которую я описал?
Должен ли я использовать наследование одиночной таблицы и создавать модель арендатора; модель менеджера; и модель владельца? Проблема, с которой я столкнулся, заключалась в том, что один пользователь может быть как менеджером, так и владельцем. Это может быть разрешено к тому времени, имея таблицы ролей для пользователя, где у пользователя много ролей, а роль имеет много пользователей. Я также посмотрел таблицу профилей с индивидуальным совпадением с пользовательской таблицей и сделал это полиморфным, но я не думал, что эта ситуация действительно требует этого, и это не решило проблему, когда пользователь может быть владельцем и менеджер.....
Вот когда я начал думать, что, возможно, я уже думал о проблеме и придумал то, что вы видите здесь.
Я приветствую любые конструктивные комментарии, которые у вас могут быть. Пожалуйста, имейте в виду, что я никогда ничего не строил в Rails, и это первая попытка, неделю назад я даже не устанавливал рельсы на своем компьютере.
Я не знаю, имеет ли это значение, но я решил, что администратор/менеджер будет отвечать за создание пользователей. Это не будет самонастраивающийся тип сайта. Менеджер добавит новых владельцев, когда он зарегистрирует нового владельца, и то же самое будет для арендаторов. Это упростит определение типа пользователя, который он создает.
Спасибо за понимание, которое у вас может быть.