Dudas de diseño de base de datos, y a lgo más


#1

Hola, de nuevo.
Cómo aún no me ha podido responder nadie al post anterior. No me queda
más remedio que tirar para adelante con lo que sé (que ya se ve que es
poco) :-).

Para manejar los roles de usuario voy a tirar por lo siguiente:
class Role
has_many :users, :trough => RoleUser
has_many :role_users, :dependent => :destroy
end
class User
has_many :role, :trough => RoleUser #Puesto que sólo quiero un role por
usuario
has_many :role_users, :dependent => :destroy
end
class RoleUser
belongs_to :user
belongs_to :role
end

¿Esto está correcto así? ¿Es la relacion adecuada?
Sobre todo me precupa el tema singulares, plurales, etc.

Luego, siguiente paso. Ahora mismo tengo controladores y vistas de
User y Role siguiendo el patron REST pero cada modelo por separado.
Me interesa crear una vista donde asignar los roles a los usuarios.
Por tanto la deberé crear en RoleUser (entiendo), ¿Pero ya no tengo
tan claro el controlador donde debe estar. ¿En RoleUser tambien, o en
User?
Y otra duda es cómo hago para que cuando se cree un nuevo usuario,
automáticamente se le asigne un rol por defecto.
Bueno, que cómo véis tengo todo esto un poco verde.

Gracias de antemano.


Fernando V.
Web Designer
http://www.fernandoval.es


#2

Hola,

Fernando dijo [Sat, May 02, 2009 at 11:15:11AM +0200]:

class RoleUser
belongs_to :user
belongs_to :role
end

¿Esto está correcto así? ¿Es la relacion adecuada?
Sobre todo me precupa el tema singulares, plurales, etc.

Si estás yendo a través de una tabla intermedia, estás permitiendo una
relación muchos-a-muchos. Claro, podrías agregar validaciones en
RoleUser para que sólo haya un rol por usuario - pero no tendría
sentido. Mucho mejor (y mucho más simple):

class Role
has_many :users
end
class User
belongs_to :role
end

Luego, siguiente paso. Ahora mismo tengo controladores y vistas de
User y Role siguiendo el patron REST pero cada modelo por separado.
Me interesa crear una vista donde asignar los roles a los usuarios.
Por tanto la deberé crear en RoleUser (entiendo), ¿Pero ya no tengo
tan claro el controlador donde debe estar. ¿En RoleUser tambien, o en
User?

Claro, es que partes de un modelado no adecuado :slight_smile: En este caso, desde
Role podrías ver la lista de usuarios que forman parte de cada uno de
dichos roles (permitiendo agregar/elminar, si quieres), y desde tus
vistas de usuarios podrás seleccionar a qué (único) rol
pertenecen. Claro está, el que tengas estructurado alrededor de REST
no te debe restar flexibilidad en cómo estructurar las vistas.

Me permito sólo hacer una anotación: Si bien desconozco tu sistema, en
general el modelo de roles por usuario se enriquece cuando permites
múltiples roles - Es mucho más flexible, un usuario puede tener cero o
más roles asignados, y cada rol le agrega “poderes” (permisos,
privilegios, etc.) a su cuenta.

Y otra duda es cómo hago para que cuando se cree un nuevo usuario,
automáticamente se le asigne un rol por defecto.
Bueno, que cómo véis tengo todo esto un poco verde.

Podrías hacer algo así:

class User
belongs_to :role
before_validation_on_create :ensure_default_role

proteced
def ensure_default_role
# Podrías definir algo como default - en este caso, me voy a
# :first y punto
role = Role.find(:first) if role.nil?
end
end

Saludos,


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#3

Gracias gwolf,

La verdad es que si que es un poco complicarse la vida con lo de la
tabla intermedia, pero es que cómo al instalar “role_requeriment” me
ha creado la tabla roles y la tabla roles_users con los campos user_id
y role_id, pues he pensado que lo mejor era continúar por
ahí.
Pero creo que voy a tirar por algo parecido a lo que me planteas, o
icluso de momento crear un array en el modelo con los tres roles y
directamente cargarlos en un campo role del modelo user.

Por el contrario si tiro por la opción que me planteas, lo que no
acabo de ver es que lo usuarios pertenzcan a los roles y no al reves.
Si me lo explicas me harías un favor, porque no lo acabo de ver.

Muchas gracias de todos modos.

El día 2 de mayo de 2009 16:31, Gunnar W. removed_email_address@domain.invalid
escribió:>> has_many :role, :trough => RoleUser #Puesto que sólo quiero un role por usuario

Si estás yendo a través de una tabla intermedia, estás permitiendo una

Luego, siguiente paso. Ahora mismo tengo controladores y vistas de
pertenecen. Claro está, el que tengas estructurado alrededor de REST
Bueno, que cómo véis tengo todo esto un poco verde.
role = Role.find(:first) if role.nil?
Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando V.
Web Designer
http://www.fernandoval.es


#4

Fernando dijo [Sat, May 02, 2009 at 09:34:34PM +0200]:

Por el contrario si tiro por la opción que me planteas, lo que no
acabo de ver es que lo usuarios pertenzcan a los roles y no al reves.
Si me lo explicas me harías un favor, porque no lo acabo de ver.

La pertenencia es en el sentido del modelado. Míralo de esta manera:
Si tienes veinte usuarios y tres roles (digamos, usuario plano,
moderador y administrador), ¿cuántos roles tiene cada usuario? Según
tu modelo, uno sólo. ¿Y cuántos usuarios tiene un rol? Bueno, tal vez
sean respectivamente 15, 4 y 1.

Entonces, si bien un rol no es un sujeto activo (como un usuario),
puedes ver claramente dónde está el uno y dónde están los muchos. Cada
rol tiene muchos (has_many) usuarios, y cada usuario pertenece a un
(y sólamente un - belongs_to) rol.

Saludos,


Gunnar W. - removed_email_address@domain.invalid - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF


#5

Ah. vale. ya entiendo…

Muchas gracias.

El día 3 de mayo de 2009 20:47, Gunnar W. removed_email_address@domain.invalid
escribió:>>

puedes ver claramente dónde está el uno y dónde están los muchos. Cada
Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando V.
Web Designer
http://www.fernandoval.es