Forum: Rails-ES Dudas de diseño de base de datos, y a lgo más...

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
7cc80e366962ecdea03eb1b150f6abf1?d=identicon&s=25 Fernando Val (aaromnido)
on 2009-05-02 11:15
(Received via mailing list)
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 Val
Web Designer
http://www.fernandoval.es
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-05-02 16:54
(Received via mailing list)
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 :) 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 Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
7cc80e366962ecdea03eb1b150f6abf1?d=identicon&s=25 Fernando Val (aaromnido)
on 2009-05-02 21:35
(Received via mailing list)
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 Wolf <gwolf@gwolf.org>
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
> Ror-es@lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es
>



--
Fernando Val
Web Designer
http://www.fernandoval.es
C98e88f3e69340d27466baadb2b80b4c?d=identicon&s=25 Gunnar Wolf (Guest)
on 2009-05-03 21:44
(Received via mailing list)
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 Wolf - gwolf@gwolf.org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
7cc80e366962ecdea03eb1b150f6abf1?d=identicon&s=25 Fernando Val (aaromnido)
on 2009-05-03 22:53
(Received via mailing list)
Ah. vale. ya entiendo...

Muchas gracias.

El día 3 de mayo de 2009 20:47, Gunnar Wolf <gwolf@gwolf.org>
escribió:>>
> puedes ver claramente dónde está el uno y dónde están los muchos. Cada
> Ror-es mailing list
> Ror-es@lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es
>



--
Fernando Val
Web Designer
http://www.fernandoval.es
This topic is locked and can not be replied to.