Tentar definir named_scopes e outras relações ActiveRecord em todos os modelos
-
20-08-2019 - |
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
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.