Есть ли передовой опыт / согласованный способ обновления поля базы данных, которое содержит хранилище значений хеш-ключа? - PullRequest
7 голосов
/ 22 января 2012

Я имею в виду функцию хранилища данных в Rails 3.2, в которой есть возможность хранить хранилища значений ключей в текстовом поле, даже если вы используете реляционную базу данных, такую ​​как MySQL ... она прекрасно работает, когда программно манипулирование полями.

Но какая документация существует для обновления этих полей из формы RESTful HTML? Или это то, что вообще не рекомендуется? То есть лучшим решением было бы перейти на NoSQL?

Ответы [ 2 ]

0 голосов
/ 17 января 2013

Хотя вопрос довольно старый, кто-то еще может найти его полезным, но я также довольно нов в рубине и рельсах, так что может быть лучший способ сделать это.

В модели:

#user.rb

attr_accessible :preferences
store :preferences

тогда в частичной форме:

#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 %>

Теперь, чтобы добавить несколько дополнительных полей из формы, я создал 2 attr_accessor в модели:

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

затем добавил 2 новых поля в форму

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

на моем контроллере я сделал функцию, которая проверяет наличие новых полей и затем объединяет предыдущие значения префов с новыми, как это:

#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
...

сделал, что я вернул его и передал update_attributes, надеюсь, это помогло!

0 голосов
/ 14 марта 2012

Если я понимаю вопрос, я думаю, что вам просто нужно объявить имя поля, содержащее хранилище, и связанные методы доступа (свойства) в модели, например

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

В этот момент поле работает с AR и AREL точно так же, как с любым другим, даже с формами.

Здесь очень мало магии. Поле содержит хэш значений; объявление магазина позволяет Rails знать, что вы можете ссылаться на них как что-то .weight или something.color, будь то чтение или запись. Просто и гладко. Классический DHH.

...