Buscar usuarios con determinado rol

Buenas,

Tengo dos modelos, Usuario y Roles, están relacionados N:N.
En el controlador, necesito sacar un objeto @clientes, que serían los
usuarios que tuviesen el rol de cliente. Como puedo hacer esta búsqueda?

Muchas gracias,

Antonio

Suponiendo que el objeto ‘role’ tiene un atributo llamado ‘title’,
cuyo contenido es el nombre del rol, a mí se me ocurre hacer algo así
(no sé si habrá alguna manera mejor):

class Usuario < ActiveRecord::Base

has_and_belongs_to_many :roles

def self.find_by_role(role_title)
role = Role.find_by_title(role_title)
unless role.nil?
Usuario.find(:all).reject {|usuario|
!usuario.roles.include?(role)}
else
[]
end
end

end

Con lo cual, en el controller ya podrás hacer:

@clientes = Usuario.find_by_role(‘cliente’)

Salu2,

Javi

El 29/08/07, Antonio R. [email protected]
escribió:> Buenas,

Ei, muchas gracias!

Funciono perfecto, lo he podido probar y genial :smiley:

Gracias, hasta otra.

On Thu, 30 Aug 2007 09:13:03 +0200, “Javier Vidal P.”

¿Y algo así?:

def self.find_by_role(role_title)
find(:all, :conditions => “roles.title = ‘#{role_title}’”, :include
=> :role)
end

Saludos

Javier Vidal P.
escribió:> Suponiendo que el objeto ‘role’ tiene un atributo llamado ‘title’,

else

usuarios que tuviesen el rol de cliente. Como puedo hacer esta búsqueda?


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


/**

Je, je, en el fondo estaba convencido de que tenía que haber una forma
más sencilla.

Lo que yo proponía:

  • es menos sencillo
  • con muchos datos seguro que no es nada óptimo, ya que:

la forma más “rails” de Borja sólo genera la siguiente consulta contra
la base de datos:

Usuario Load Including Associations (0.007860) SELECT usuarios.id
AS t0_r0, usuarios.login AS t0_r1, usuarios.email AS t0_r2,
usuarios.crypted_password AS t0_r3, usuarios.salt AS t0_r4,
usuarios.created_at AS t0_r5, usuarios.updated_at AS t0_r6,
usuarios.remember_token AS t0_r7,
usuarios.remember_token_expires_at AS t0_r8,
usuarios.activation_code AS t0_r9, usuarios.activated_at AS
t0_r10, usuarios.pagado_at AS t0_r11, roles.id AS t1_r0,
roles.title AS t1_r1 FROM usuarios LEFT OUTER JOIN roles_usuarios ON
roles_usuarios.usuario_id = usuarios.id LEFT OUTER JOIN roles ON
roles.id = roles_usuarios.role_id WHERE (roles.title = ‘admin’)

la mía en cambio genera:

Role Load (0.001441) SELECT * FROM roles WHERE (roles.title =
‘admin’) LIMIT 1
Usuario Load (0.003518) SELECT * FROM usuarios
Join Table Columns (0.003088) SHOW FIELDS FROM roles_usuarios
Role Load (0.001549) SELECT * FROM roles INNER JOIN roles_usuarios
ON roles.id = roles_usuarios.role_id WHERE (roles_usuarios.usuario_id
= 2 )
Join Table Columns (0.002949) SHOW FIELDS FROM roles_usuarios
Role Load (0.001943) SELECT * FROM roles INNER JOIN roles_usuarios
ON roles.id = roles_usuarios.role_id WHERE (roles_usuarios.usuario_id
= 3 )

lo cual tiene una pinta muy fea si el número de usuarios es grande.

Sólo una última cosa, el código finalmente sería:

def self.find_by_role(role_title)
find(:all, :conditions => [“roles.title = ?”, role_title],
:include => :roles)
end

Muchas gracias,

Javi

El 30/08/07, Borja Martín [email protected]
escribió:> ¿Y algo así?: