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’,
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:
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