Associações HMT com acl9

acl9já 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_userse 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 enrollmentsou o que for mais adequado para você.

Agora podemos criar nosso modelo de junção e substituir acl9associaçã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 acl9métodos como , e ainda funcionarão.has_role?has_role!has_no_role!