Tratando de definir named_scopes y otras relaciones ActiveRecord en todos los modelos
-
20-08-2019 - |
Pregunta
Estoy tratando de definir un named_scope para todos mis modelos en una aplicación Rails.
Actualmente, he podido acercarme a esto escribiendo un inicializador para ActiveRecord :: Base y colocando métodos regulares allí. Por supuesto, esto no ofrece una ventaja real cuando se trata de crear cadenas de consulta y es probablemente la forma menos complicada de hacer el trabajo.
Sin embargo, no funciona cuando empiezo a intentar usar los métodos ActiveRecord has_many, named_scope, etc ...
Si bien entiendo que mi named_scope probablemente no sea correcto, realmente solo quiero ayuda para definir el named_scope. Además, no estoy interesado en ninguna GEM de Ruby ACL en este momento.
En inicializadores /:
class ActiveRecord::Base
has_many(:permissions)
named_scope(:acl_check, lambda do |user_id, method|
{
:include => :permission,
:conditions => [
["permissions.user_id=?", user_id],
["permissions.method=?", method],
["permissions.classname=?", self.class.name]
]
}
end)
# Conducts a permission check for the current instance.
def check_acl?(user_id, method)
# Perform the permission check by User.
permission_check = Permission.find_by_user_id_and_instance_id_and_classname_and_method(user_id, self.id, self.class.name, method)
if(permission_check)
# If the row exists, we generate a hit.
return(true)
end
# Perform the permission check by Role.
# Otherwise, the permissions check was a miss.
return(false)
end
end
Solución
el has_many
probablemente no funcionará porque se evalúa en el cuerpo de la clase y las claves foráneas esperadas son para la clase en la que se evaluó en lugar de las clases heredadas. (por ejemplo, el modelo de blog con id = 42 puede tener muchos modelos de comentarios almacenados con blog_id = 42, las claves que se necesitan para que funcione se basan en el nombre de la clase)
El ámbito con nombre debería funcionar si es correcto.
El método heredado debería funcionar.