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
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 
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’,
elseusuarios 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:
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í?:
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs