Skip to content

Instantly share code, notes, and snippets.

@JamesAndresCM
Last active June 8, 2023 14:36
Show Gist options
  • Save JamesAndresCM/bd814ed7e103d673ea68649c99ffa476 to your computer and use it in GitHub Desktop.
Save JamesAndresCM/bd814ed7e103d673ea68649c99ffa476 to your computer and use it in GitHub Desktop.

Estos serian los perfiles?, que en realidad el modelo es group

Customer.first.groups
  Customer Load (1.3ms)  SELECT  "customers".* FROM "customers" WHERE "customers"."deleted_at" IS NULL ORDER BY "customers"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Group Load (1.4ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."deleted_at" IS NULL AND "groups"."customer_id" = $1 LIMIT $2  [["customer_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Group id: 3, name: "Admin", created_at: "2023-03-23 19:29:42", updated_at: "2023-03-23 19:29:42", customer_id: 1, deleted_at: nil, local_id: "71877852-23aa-43fa-8ed0-ea46ed4b76e2", threshold_quantity: nil>, #<Group id: 13, name: "prueba", created_at: "2023-06-07 22:08:25", updated_at: "2023-06-07 22:08:25", customer_id: 1, deleted_at: nil, local_id: "b4f5e733-2571-49c8-a8bb-3352085c410a", threshold_quantity: nil>]>

En realidad los jobs son los "grupos" que uno ve en la interfaz?

Customer.first.jobs
  Customer Load (1.2ms)  SELECT  "customers".* FROM "customers" WHERE "customers"."deleted_at" IS NULL ORDER BY "customers"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Job Load (0.7ms)  SELECT  "jobs".* FROM "jobs" WHERE "jobs"."deleted_at" IS NULL AND "jobs"."customer_id" = $1 LIMIT $2  [["customer_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Job id: 1, customer_id: 1, name: "Taker group", created_at: "2023-03-23 19:29:48", updated_at: "2023-03-23 19:29:48", deleted_at: nil, group_id: nil, local_id: "3dbc840a-96ad-49cc-be7c-243b951e203a">, #<Job id: 2, customer_id: 1, name: "otro grupo", created_at: "2023-04-11 21:52:03", updated_at: "2023-04-11 21:52:03", deleted_at: nil, group_id: 3, local_id: "6b7f975b-4c66-418e-8543-d82ba74103f1">, #<Job id: 3, customer_id: 1, name: "grupo capcom", created_at: "2023-06-07 21:10:39", updated_at: "2023-06-07 21:10:39", deleted_at: nil, group_id: 3, local_id: "abf30275-4c11-4baa-a2b6-6157eeada012">]>

Entonces cada uno de estos grupos se asocia con el modelo Group

Customer.first.jobs.last.group
  Customer Load (0.8ms)  SELECT  "customers".* FROM "customers" WHERE "customers"."deleted_at" IS NULL ORDER BY "customers"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Job Load (0.8ms)  SELECT  "jobs".* FROM "jobs" WHERE "jobs"."deleted_at" IS NULL AND "jobs"."customer_id" = $1 ORDER BY "jobs"."id" DESC LIMIT $2  [["customer_id", 1], ["LIMIT", 1]]
  Group Load (2.1ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."deleted_at" IS NULL AND "groups"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
=> #<Group id: 3, name: "Admin", created_at: "2023-03-23 19:29:42", updated_at: "2023-03-23 19:29:42", customer_id: 1, deleted_at: nil, local_id: "71877852-23aa-43fa-8ed0-ea46ed4b76e2", threshold_quantity: nil>

Y un grupo es el que tiene un Rol, mediante la tabla intermedia RoleGroup

Customer.first.jobs.last.group.roles.first
  Customer Load (1.2ms)  SELECT  "customers".* FROM "customers" WHERE "customers"."deleted_at" IS NULL ORDER BY "customers"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Job Load (0.7ms)  SELECT  "jobs".* FROM "jobs" WHERE "jobs"."deleted_at" IS NULL AND "jobs"."customer_id" = $1 ORDER BY "jobs"."id" DESC LIMIT $2  [["customer_id", 1], ["LIMIT", 1]]
  Group Load (0.3ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."deleted_at" IS NULL AND "groups"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
  Role Load (0.8ms)  SELECT  "roles".* FROM "roles" INNER JOIN "role_groups" ON "roles"."id" = "role_groups"."role_id" WHERE "role_groups"."group_id" = $1 ORDER BY "roles"."id" ASC LIMIT $2  [["group_id", 3], ["LIMIT", 1]]
=> #<Role id: 1, name: "container#read", created_at: "2023-03-23 19:29:39", updated_at: "2023-03-23 19:29:39">

Entonces un usuario pertenece a los perfiles/group cuando preguntamos por group

Customer.first.users.first.groups
Customer Load (0.6ms)  SELECT  "customers".* FROM "customers" WHERE "customers"."deleted_at" IS NULL ORDER BY "customers"."id" ASC LIMIT $1  [["LIMIT", 1]]
  User Load (1.3ms)  SELECT  "users".* FROM "users" WHERE "users"."deleted_at" IS NULL AND "users"."customer_id" = $1 AND (auditor_level_id IS NULL OR auditor_level_id = 0) ORDER BY "users"."id" ASC LIMIT $2  [["customer_id", 1], ["LIMIT", 1]]
  Group Load (0.8ms)  SELECT  "groups".* FROM "groups" INNER JOIN "admin_groups" ON "groups"."id" = "admin_groups"."group_id" WHERE "groups"."deleted_at" IS NULL AND "admin_groups"."adminable_id" = $1 AND "admin_groups"."adminable_type" = $2 LIMIT $3  [["adminable_id", 1], ["adminable_type", "User"], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Group id: 3, name: "Admin", created_at: "2023-03-23 19:29:42", updated_at: "2023-03-23 19:29:42", customer_id: 1, deleted_at: nil, local_id: "71877852-23aa-43fa-8ed0-ea46ed4b76e2", threshold_quantity: nil>]>

Supongamos que tengo un nuevo rol

Role.last
  Role Load (1.4ms)  SELECT  "roles".* FROM "roles" ORDER BY "roles"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> #<Role id: 105, name: "companies#index", created_at: "2023-06-07 21:39:16", updated_at: "2023-06-07 21:39:16">

Y quiero que un usuario de un cliente tenga permisos para el index de company, entonces se asociaria el Role con El grupo Admin ?, pero esto quiere decir que todos los jobs/grupos que pertenezcan al grupo Admin tendrian permisos de index sobre company? , Entonces al final yo le asigno permiso a un grupo en particular que tiene relacion con "grupos" que en realidad son jobs...

Pero en realidad lo que yo busco es agregarle permisos a un job por ejemplo quiero que el job Taker Group pueda tener acceso al Rol companies#index, eso quiere decir que con el modelo actual como un job pertenece a un grupo si yo le asigno esos permisos al Grupo admin todos los jobs que pertenezcan a este grupo tendran permisos, no seria mejor entonces asociar directamente los jobs con los roles?, mi idea es desplegar en un selector todos los jobs de un customer y a cada uno de ellos otorgarle permisos, entonces si un usuario esta dentro de esos jobs tiene acceso a X accion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment