7

Mi riferisco alla funzione Data Store di Rails 3.2, in cui esiste la possibilità di archiviare gli archivi di valori-chiave in un campo di testo, anche se si utilizza un database relazionale come MySQL ... funziona bene quando si manipola a livello di programmazione i campi.Esiste un metodo ottimale/coerente per aggiornare un campo del database che contiene un archivio di valori-chiave hash?

Ma quale documentazione è disponibile per aggiornare questi campi da un modulo HTML RESTful? O è qualcosa che non è raccomandato a tutti? Cioè, la soluzione migliore sarebbe passare a NoSQL?

risposta

0

Se ho capito la domanda, penso che non vi resta che dichiarare il nome del campo tenendo il negozio, e le funzioni di accesso associati (proprietà) nel modello, come

store :settings, accessors: [ :weight, :length, :color ] 

a questo punto il campo funziona con AR e AREL come qualsiasi altro, anche con le forme.

C'è davvero poca magia qui. Il campo contiene un hash di valori; la dichiarazione del negozio consente a Rails di sapere che puoi fare riferimento ad essi come qualcosa.peso o qualcosa.colore, sia che leggi o scrivi. Semplice e lucido. DHH classico.

0

sebbene la domanda sia piuttosto vecchia, qualcun altro potrebbe trovarlo utile, anche se è piuttosto nuovo in rubino e rotaie, quindi potrebbe esserci un modo migliore per farlo.

Nel modello:

#user.rb 

attr_accessible :preferences 
store :preferences 

poi in forma parziale:

#views/users/_form.rb 

<% @user.preferences.each do |k, v| %> 
    <% form.fields_for :preferences, @user.preferences[k] do |p| %> 
     <div class="field"> 
     <%= p.label k %> 
     <br/> 
     <%= p.text_field k, :value => v %> 
     </div> 
    <% end %> 
<% end %> 

ora per aggiungere alcuni campi aggiuntivi dalla forma Ive ha creato 2 attr_accessor nel modello:

attr_accessible ... , :new_pref_key, :new_pref_val 
attr_accessor ... , :new_pref_key, :new_pref_val 

quindi aggiunto i 2 nuovi campi nel modulo

<%= f.label :new_pref_key %> 
<%= f.text_field :new_pref_key %> 
<%= f.label :new_pref_val %> 
<%= f.text_field :new_pref_val %> 

sul mio controller ho fatto una funzione che controlla la presenza di nuovi campi e poi unire i valori precedenti delle preferenze con quelle nuove, come questo:

#users_controller.rb 
... 
new_key = params[:user][:preferences][:new_pref_key] 
new_val = params[:user][:preferences][:new_pref_val] 
new_preference = { 
    new_key => new_val 
} 
current_params = params[:user][:preferences].merge! new_preference 
... 

fatto che io ritorni e passalo agli update_attributes, spero che sia d'aiuto!

Problemi correlati