(Rails) Gerenciando USER PREFS com um substituto MASTER PREFS…?
-
20-09-2019 - |
Pergunta
Estou procurando um mecanismo para facilitar as preferências do usuário.Também quero ter um conjunto de preferências "mestres" que serão usadas se o usuário conectado no momento não tiver um conjunto de preferências específico.Vejo diversas questões parecidas com essa, mas parecem entrar na teoria ao invés de simplesmente propor uma solução de qualidade.
Basicamente, estou procurando informações sobre gerenciamento e armazenamento - modelos, controladores, etc.Inicialmente, eu estava pensando em simplesmente usar uma tabela normalizada com mais de 50 colunas (para desempenho, etc.).No entanto, pretendo adicionar várias preferências desconhecidas no futuro e, deixando de lado o desempenho, posso imaginar várias colunas ficando fora de controle.Pensamentos?
Solução
Na minha opinião, a melhor maneira de definir e usar padrões é adicionar outra linha na tabela de preferências do usuário e carregá-la como uma variável de classe em seu modelo.Em seguida, substitua os acessadores para encontrar os padrões se a preferência não tiver sido encontrada.Algo assim:
class UserPreference < ActiveRecord::Base
# load default preferences as a class variable
@@defaults ||= find(1).attributes
# redefine accessors or each column to load default if nil
column_names.each do |column|
method_name = "#{column}_with_default".to_sym
send :define_method, method_name do
value = send("#{column_without_default}")
case value
when nil
@@defaults[column]
else
value
end
end
alias_method_chain column, :default
end
...
end
Essencialmente, as preferências padrão (carregadas da linha 1) são armazenadas no Modelo como uma variável de classe.Todos os acessadores são redefinidos e fazem parte de uma cadeia de métodos de alias para que o padrão seja retornado se o valor retornado for nulo.Eu queria usar || em vez de case, mas isso iria causar problemas no caso de o utilizador ter definido uma preferência booleana para false.
Editar:N. B.Não conheço uma boa maneira de atualizar os padrões em um aplicativo Rails sem reiniciar o servidor.
Outras dicas
Se você não precisar manipular ou classificar por preferências individuais no banco de dados, poderá usar uma única coluna de máscara de bits (inteiro).Basicamente, uma máscara de bits é um conjunto de chaves liga/desliga representadas como um número binário.Por exemplo, digamos que temos três preferências:
- ver assinaturas
- ver cores
- ver nomes completos
Digamos que um usuário tenha 1 e 3 ativado e 2 desativado.Usando 1s para ligar e 0s para desligar, a máscara de bits para isso é:
101
(ligado desligado ligado)
Isso é armazenado no banco de dados como 5
porque 101
é 5 em binário.As máscaras de bits são fáceis de armazenar no banco de dados (use uma única coluna inteira) e fáceis de manipular quando você conhece os operadores (para mesclar as preferências do usuário nos padrões do site).Ryan Bates tem um ótimo tutorial sobre como usar bitmasks no Rails: Associação Incorporada.Esperamos que isso lhe dê o exemplo concreto que você está procurando.