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?

Foi útil?

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:

  1. ver assinaturas
  2. ver cores
  3. 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.

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