Pergunta

Estou tentando definir uma named_scope para todos os meus modelos em uma aplicação Rails.

Atualmente, eu tenho sido capaz de chegar perto de isso escrevendo um inicializador para ActiveRecord :: Base e colocar métodos regulares lá. Claro, isso oferece acesso sem real quando se trata de criar cadeias de consulta e é provavelmente a maneira menos rails-ey de começar o trabalho feito.

No entanto, ele não funciona quando eu começar a tentar usar o has_many, named_scope, etc ... métodos ActiveRecord.

Embora eu entenda a minha named_scope é provável não é correto, eu realmente só quer ajuda para obter o named_scope definido. Além disso, eu não estou interessado em qualquer GEMs Rubi ACL no presente.

Em initializers /:

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
Foi útil?

Solução

o has_many provavelmente não vai funcionar porque ela é avaliada no corpo da classe e as chaves estrangeiras são esperadas para a classe em que foi avaliada em vez das classes que herdam. (Por exemplo, modelo Blog com id = 42 pode ter muitos modelos armazenado Comentário com blog_id = 42, as chaves que são necessários para fazer o trabalho são baseados no nome da classe)

O escopo nomeado deve funcionar se ele está correto.

O método herdado deve funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top