是否有最佳实践/连贯方式来更新包含哈希键值存储的数据库字段?

时间:2012-01-22 17:37:21

标签: mysql ruby-on-rails-3 database-design hash ruby-on-rails-3.2

我指的是Rails 3.2的数据存储功能,即使您正在使用关系,也可以选择将键值存储存储在文本字段中像MySQL一样的数据库......在以编程方式操作字段时它可以正常工作。

但是有哪些文档可以从RESTful HTML表单更新这些字段?或者这是不推荐的东西?也就是说,更好的解决方案是去NoSQL吗?

2 个答案:

答案 0 :(得分:0)

如果我理解了这个问题,我认为你只需要声明持有商店的字段名称,以及模型中相关的访问者(属性),例如

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

此时,该字段与AR和AREL一样,即使使用表单,也可与其他字段一起使用。

这里的魔力很少。该字段包含值的哈希值;商店声明让Rails知道你可以像thing.weight或something.color一样引用它们,无论是阅读还是写作。简单而光滑。经典DHH。

答案 1 :(得分:0)

虽然问题很老,但其他人可能觉得它很有用,而且在ruby和rails中也是新的,所以可能有更好的方法来做到这一点。

在模型中:

#user.rb

attr_accessible :preferences
store :preferences

然后以形式partial:

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

现在在模型中添加一些额外的字段:ive在模型中创建了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 %>

在我的控制器上,我创建了一个检查新字段是否存在的函数,然后将prefs的先前值与新的字段合并,如下所示:

#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,希望它有所帮助!