Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

278
Vistas
Verificación de que todos los valores de la matriz se encuentran en un hash de claves seleccionadas

Si un usuario tiene un conjunto de roles adjuntos y cada rol tiene un conjunto de ámbitos, ¿cómo puedo comprobar si el usuario tiene todos los ámbitos?

Por ejemplo, tengo un mapeo de roles a ámbitos.

 scopes_for_roles = { artist: ['draw', 'sing'], teacher: ['read', 'write'], athlete: ['draw', 'read', 'dance'] }

Para User_A que tiene roles de athlete y teacher , ¿cómo puedo verificar ( return T/F ) si tiene los siguientes alcances?

 scopes = ['read', 'write'] --> TRUE scopes = ['sing', 'read', 'write', 'dance'] --> FALSE # Missing sing

Lo que he probado es el siguiente

 roles.product(scopes).select { |role, scope| scopes_for_roles[role].include?(scope) if scopes_for_roles.key?(role) }.size >= scopes.size

Sin embargo, creo que el fragmento anterior tiene un error en el que solo verifica el .size de las permutaciones seleccionadas y no los alcances reales en sí. Entonces, si un Usuario tiene los roles de teacher y athlete , el fragmento devolverá true para los ámbitos ['read', 'sing'] porque 'read' se encuentra DOS VECES en los roles de teacher y athlete .

Nota: podría tener varios bucles for con comprobaciones de clave-valor, pero me preguntaba si había un enfoque más limpio/más corto como el fragmento que proporcioné.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Sí, los ámbitos duplicados son un problema cuando confía en contar. Para continuar con ese enfoque, deberá aplicar Array#uniq para eliminar los duplicados en algún momento. (Además, includes_code? no es un método de Ruby). Le sugiero que abandone el enfoque de conteo. Primero extraiga los ámbitos relevantes de scopes_for_roles :

 roles = [:athlete, :teacher] scopes = ['read', 'write']
 a = scopes_for_roles.values_at(*roles) #=> [["draw", "read", "dance"], ["read", "write"]]

Consulte Hash#values_at .

En este punto tienes varias opciones. Quizás lo más fácil es aplanar primero a :

 b = a.flatten #=> ["draw", "read", "dance", "read", "write"]

Luego ejecute uno de los siguientes:

 scopes.all? { |s| b.include?(s) } #=> true (scopes - b).empty? #=> true (scopes - b #=> []) scopes & b == scopes #=> true (scopes & b #=> ['write', 'dance'])

Consulte Array#- y Array#& .

En lugar de flatten , podrías usar

 b = a.reduce(:+) #=> ["draw", "read", "dance", "read", "write"]

o

 b = a.reduce(:|) #=> ["draw", "read", "dance", "write"]

Ver Matriz#| .

Si

 scopes = ['sing', 'read', 'write', 'dance']

entonces

 scopes.all? { |s| b.include?(s) } #=> false (scopes - b).empty? #=> false (scopes - b #=> ['sing']) scopes & b == scopes #=> false (scopes & b #=> ['read', 'write', 'dance'])

Sugiero lo siguiente.

 def have_em_all?(scopes_for_roles, roles, scopes) (scopes - scopes_for_roles.values_at(*roles).reduce(:|)).empty? end
 roles = [:athlete, :teacher] scopes1 = ['read', 'write'] scopes2 = ['sing', 'read', 'write', 'dance']
 have_em_all?(scopes_for_roles, roles, scopes1) #=> true have_em_all?(scopes_for_roles, roles, scopes2) #=> false

Para el primer ejemplo, los pasos son los siguientes.

 a = scopes_for_roles.values_at(*roles) #=> [["draw", "read", "dance"], ["read", "write"]]
 b = a.reduce(:|) #=> ["draw", "read", "dance", "write"]
 c = scopes1 - b #=> [] c.empty? #=> true

En el segundo ejemplo obtendríamos

 c = scopes2 - b #=> ["sing"] c.empty? #=> false
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda