2016-10-15 4 views
0

Итак, я создаю приложение, использующее 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 

, но я застрял на том, как сделать это с несколькими типами пользователей?

Любая помощь здесь была бы очень признательна.

EDIT 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 %> 

EDIT # 2 Оставшееся сообщение об ошибке Ссылка на перечисление

Вот моя модель плана:

перечисление: plan_type, [: Ответчик,: first_responder,: patrol_pro,: хранитель]

USER_LIMITS = ActiveSupport :: HashWithIndifferentAccess.new ( Ответчик: 6, first_responder: 12, patrol_pro: 30, опекун: 60 )

Вот сообщение об ошибке:

enter image description here

И элемент формы не изменился.

ответ

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 
+0

Im собирается редактировать свой пост с им ошибка при получении с предложением .. –

+0

Ах, извините, теперь я вижу, что это за ошибка, я просто скопировал ваши константы в USER_LIMITS и забыл добавить запятую после каждого. – max

+0

нет, все еще есть проблема, связанная с переписью, которую он опубликовал. Теперь обновляется –

Смежные вопросы