Domanda

Sto cercando un meccanismo attraverso il quale facilitare le preferenze dell'utente.Voglio anche avere un set di preferenze "principali" da utilizzare se l'utente attualmente connesso non ha un set di preferenze specifico.Vedo diverse domande simili a questa, ma sembrano entrare nella teoria invece di proporre semplicemente una soluzione di qualità.

Fondamentalmente sto cercando input sulla gestione e sull'archiviazione: modelli, controller, ecc.Inizialmente stavo pensando di utilizzare semplicemente una tabella normalizzata di oltre 50 colonne (per prestazioni, ecc.).Tuttavia, ho intenzione di aggiungere varie preferenze sconosciute in futuro e, prestazioni a parte, potrei immaginare che più colonne sfuggano di mano.Pensieri?

È stato utile?

Soluzione

Nella mia mente, il modo migliore per definire e utilizzare le impostazioni predefinite è di aggiungere un'altra riga nella tabella preferenze degli utenti, e caricarlo come una variabile di classe nel modello. Poi ignorare le funzioni di accesso per trovare i valori di default se non è stata trovata la preferenza. Qualcosa di simile a questo:

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

Essenzialmente le preferenze predefinite (caricati da fila 1) vengono memorizzati nel modello come una variabile di classe. Tutte le funzioni di accesso vengono ridefiniti e resi parte di una catena metodo di alias in modo che il default sarebbe tornato se il valore restituito era pari a zero. Volevo usare || invece di caso, ma che potrebbero causare problemi nel caso in cui l'utente aveva impostato una preferenza booleano false.

Modifica: N.B. Non so di un buon modo per aggiornare le impostazioni predefinite in un app rotaie senza riavviare il server.

Altri suggerimenti

Se non è necessario manipolare o ordinare in base alle preferenze individuali nel database, è possibile utilizzare una singola colonna con maschera di bit (intero).Fondamentalmente, una maschera di bit è un insieme di interruttori on/off rappresentati come un numero binario.Ad esempio, supponiamo di avere tre preferenze:

  1. visualizzare gli abbonamenti
  2. visualizzare i colori
  3. visualizzare i nomi completi

Supponiamo che un utente abbia 1 e 3 attivi e 2 disattivati.Usando 1 per on e 0 per off, la maschera di bit per questo è:

101

(acceso spento acceso)

Questo viene archiviato nel database come 5 Perché 101 è 5 in binario.Le maschere di bit sono facili da memorizzare nel database (utilizzano una singola colonna intera) e sono facili da manipolare una volta conosciuti gli operatori (per unire le preferenze di un utente nelle impostazioni predefinite del sito).Ryan Bates ha un ottimo tutorial sull'uso delle maschere di bit in Rails: Associazione incorporata.Spero che questo ti dia l'esempio concreto che stai cercando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top