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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top