acl9
já existe há um tempo, mas partes de seu código me incomodaram por um tempo, especialmente o uso de has_and_belongs_to_many
, o problema era que este método não permitia que você tivesse chaves primárias em sua tabela de junção nem carimbos de data / hora, etc.
Felizmente, o rails 3.0 surgiu e mudou a forma como as associações funcionam, aqui está como você pode substituir sua associação existente e criar um modelo de junção.
Primeiro crie as seguintes migrações:
class AddMissingFieldsToRolesUsers < ActiveRecord::Migration
def change
add_column :roles_users, :created_at, :datetime
add_column :roles_users, :updated_at, :datetime
add_column :roles_users, :id, :primary_key
end
end
Supondo que sua tabela de junção seja nomeada roles_users
e que não tenha chave primária nem timestamps.
class RenameRolesUsersToEnrollments < ActiveRecord::Migration
def change
rename_table :roles_users, :enrollments
end
end
Em seguida, renomeamos nossa tabela de junção para enrollments
ou o que for mais adequado para você.
Agora podemos criar nosso modelo de junção e substituir acl9
associação:
class Enrollment < ActiveRecord::Base
belongs_to :user
belongs_to :role
validates :user, :role, :presence => true
end
class User < ActiveRecord::Base
acts_as_authorization_subject :association_name => :roles, :join_table_name => :enrollments
has_many :enrollments
has_many :roles, :through => :enrollments
end
class Role < ActiveRecord::Base
acts_as_authorization_role :join_table_name => :enrollments
has_many :enrollments
has_many :users, :through => :enrollments
end
E agora você pode usar seu modelo de associação para navegar por usuários ou funções, você pode adicionar novos campos à sua tabela de associação e adicionar qualquer tipo de lógica que seu modelo de associação precise.
Se você gostaria de ver um aplicativo rails 3.2 que já está usando este checkout https://github.com/rubytij/usergroup os acl9
métodos como , e ainda funcionarão.has_role?
has_role!
has_no_role!