有很多方法可以实现这一点;这取决于您的需求。问问自己:“人和组织是否具有相同的属性?”
AR 枚举
如果他们这样做了,那么区分两者的唯一因素就是角色(或您想称呼的任何名称),即个人或组织。对于这种情况,Rails 4.1 provides AR enums。这是最简单的解决方案,它可以是这样的:
class User < ActiveRecord::Base
enum role: [ :person, :organization ] # @user.role => 'person', @user.person? => true
end
多态关联
另一方面,如果人员和组织仅共享某些属性,您可以考虑使用polymorphic association(如果人员和组织不共享任何属性,甚至role,它们应该是两个不同的模型)。基本模型应该包含人和组织共享的属性。个人/组织模型应包含特定于该模型的属性。
# common attributes
class User < ActiveRecord::Base
belongs_to :profile, polymorphic: true
def self.roles
%w(person organization)
end
end
# person-specific attributes
class PersonProfile < ActiveRecord::Base
has_one :user, as: :profile, dependent: :destroy
end
# organization-specific attributes
class OrganizationProfile < ActiveRecord::Base
has_one :user, as: :profile, dependent: :destroy
end
对于用户注册,您可以创建 users#new 和 users#create 操作。在您的用户注册表单(可能是app/views/users/new.html.erb)中,您可以使用select_tag 让用户指定他们的角色。然后,使用它来确定要附加到用户模型的配置文件类型。例如(users#create):
def create
@user = User.new(user_params)
if role = params[:role]
# return HTTP 400
head :bad_request and return unless User.roles.include?(role)
# Assign the User's profile
@user.profile = "#{role.capitalize}Profile".constantize.new
else
# enter your own logic here
end
@user.save ? redirect_to(@user) : render(:new)
end
在我看来,会话的处理(用户登录/注销)应该在单独的SessionsController 中处理。