按用户数限制多租户应用程序帐户

时间:2016-10-15 07:37:57

标签: ruby-on-rails ruby-on-rails-4 multi-tenant

所以我正在构建一个使用Rails 4和Apartment Gem的应用程序。

我对多租户相当新,并且已经达到了构建用户计划的程度。

我有4个主要计划,我希望每个计划在告知帐户所有者或管理员他们需要升级以注册新用户之前限制可以创建的用户数。

我想我更应该坚持应该做的事情。在我的帐户模型中,我有我的常规计划:

PLAN = %w[responder first_responder patrol_pro guardian]

这些plan_types中的每一个(我在保存到注册时的列)都有一组可以创建的用户,这些用户也可以设置为以下常量:

  RESPONDER_PLAN_USER_LIMIT = 6
  FIRST_RESPONDER_PLAN_USER_LIMIT = 12
  PATROL_PRO_PLAN_USER_LIMIT = 30
  GUARDIAN_PLAN_USER_LIMIT = 60

我还创建了以下方法来验证计划类型,但是这看起来很笨拙,并且想知道是否有一种方法可以在一种方法中实现这一点,而不是4

  def responder_plan?
    self.plan_type == 'responder'
  end

  def first_responder_plan?
    self.plan_type == 'first_responder'
  end

  def patrol_pro_plan?
    self.plan_type == 'patrol_pro'
  end

  def guardian_plan?
    self.plan_type == 'guardian'
  end

现在针对最后一个问题,要实际计算附加到我计划使用验证器执行此操作的帐户的用户,我只是不确定如何创建模型方法。

我在想这样的事情:

def over_user_limit?
  self.individual_plan? && self.users.count > INDIVIDUAL_USER_LIMIT
end

但我仍然坚持如何使用多种用户类型?

非常感谢这里的任何帮助。

编辑1:尝试将枚举添加到表单时出现错误消息

SyntaxError at /accounts/new
syntax error, unexpected tIDENTIFIER, expecting ')'
    first_responder:  12
                   ^
/Users/developer/Desktop/PatrolVault-Saas/PV_SAAS/app/models/plan.rb:7: syntax error, unexpected ':', expecting keyword_end
    patrol_pro:       30
               ^
/Users/developer/Desktop/PatrolVault-Saas/PV_SAAS/app/models/plan.rb:8: syntax error, unexpected ':', expecting keyword_end
    guardian:         60
             ^

为简洁起见,这是我的表格字段:

  <%= f.fields_for :plan do |plan| %>
  <div class="col-xs-12">
    <%= f.select :plan_type, options_for_select(Plan.plan_types.map {|k, v| [k.humanize.capitalize, k]}) %>
  </div>
  <% end %>

编辑#2引用枚举的剩余错误消息

这是我的计划模型:

枚举:plan_type,[:responder,:first_responder,:patrol_pro,:guardian]

USER_LIMITS = ActiveSupport :: HashWithIndifferentAccess.new(     响应者:6,     first_responder:12,     patrol_pro:30,     监护人:60   )

以下是错误消息:

enter image description here

表格项目没有改变。

1 个答案:

答案 0 :(得分:1)

主要问题是责任分配非常混乱。

我首先要建立两个责任非常明确的模型:

class Account < ActiveRecord::Base
  belongs_to :company
  has_one :plan
end

class Plan < ActiveRecord::Base
  belongs_to :account
end

为不同类型的计划定义规则的逻辑绝对不是帐户模型的工作。

因此,让我们在Plan类中实现规则:

class Plan < ActiveRecord::Base
  belongs_to :account
  # declare the column plans.plan_type as integer.
  enum plan_type: [:responder, :first_responder, :patrol_pro, :guardian]
  USER_LIMITS = ActiveSupport::HashWithIndifferentAccess.new(
    responder:        6,
    first_responder:  12,
    patrol_pro:       30,
    guardian:         60
  )

  def user_limit
    USER_LIMITS[self.plan_type]
  end
end

然后,您可以实施验证:

class Plan < ActiveRecord::Base
  belongs_to :account
  # declare the column plans.plan_type as integer.
  enum plan_type: [:responder, :first_responder, :patrol_pro, :guardian]
  USER_LIMITS = ActiveSupport::HashWithIndifferentAccess.new(
    responder:        6,
    first_responder:  12,
    patrol_pro:       30,
    guardian:         60
  )

  validates :must_be_below_user_limit 

  def user_limit
    USER_LIMITS[self.plan_type]
  end

  def must_be_below_user_limit
   if self.account.users.size >= user_limit
     errors[:user_limit] = "can not more than #{user_limit} users"
   end
  end
end