2009-08-28 3 views
1

Я читал несколько примеров STI Inheritence для Rails, Хотя похоже, что это соответствовало бы моим потребностям (роль/типы пользователей, наследующие от базового класса пользователя). Похоже, что он не обрабатывает пользователя с несколькими ролями слишком хорошо. В частности, потому, что он использует поле типа в базе данных.Rails Наследование типа STI для нескольких ролей на пользователя

Есть ли в этом легкая и легкая работа?

ответ

3

Я не уверен, что STI - правильное решение в сценарии пользователя/пользователя - я не думаю о ролях/типах пользователей как о конкретной форме пользователя. Я бы следующую схему:

class Membership < ActiveRecord::Base 
    belongs_to :user  # foreign key - user_id 
    belongs_to :role  # foreign key - role_id 
end 
class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :roles, :through => :membership 
end 
class Role < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :membership 
end 

Другой способ сделать это было бы использовать has_and_belongs_to_many. Вы также можете проверить плагин restful_authentication.

+2

+1 STI - это не способ реализации пользовательских ролей. –

0

Как и Энди, has_and_belongs_to_many - это еще один способ сделать это.

# user.rb 
class User < ActiveRecord::Base 
    has_and_belongs_to_many :roles 
end 

# role.rb 
class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

Примечание: вам все еще нужна таблица ассоциаций в вашей базе данных, но она просто скрыта от ваших моделей.

1

Хорошим обходным решением для вашей проблемы может быть драгоценный камень easy_roles. Вы можете найти его на github. Как уже говорилось, STI не способ реализовать ваши вещи.

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