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

Posted

技术标签:

【中文标题】是否有最佳实践/连贯的方法来更新包含哈希键值存储的数据库字段?【英文标题】:Is there a best practices/coherent way to update a database field that contains a hash key-value store? 【发布时间】:2012-02-16 07:09:27 【问题描述】:

我指的是 Rails 3.2 的数据存储功能,其中可以选择在文本字段中存储键值对存储,即使您使用的是 mysql 之类的关系数据库……它在以编程方式运行时也能正常工作操作字段。

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

【问题讨论】:

【参考方案1】:

如果我理解了这个问题,我想你只需要在模型中声明保存商店的字段名称,以及相关的访问器(属性),比如

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

此时该字段与 AR 和 AREL 一起使用,就像任何其他字段一样,即使是表单也是如此。

这里没有什么魔法。该字段包含值的散列; store 声明让 Rails 知道您可以像 something.weight 或 something.color 一样引用它们,无论是阅读还是写作。简单而光滑。经典的 DHH。

【讨论】:

【参考方案2】:

虽然这个问题已经很老了,但其他人可能会觉得它很有用,我在 ruby​​ 和 rails 中也很新,所以可能有更好的方法来做到这一点。

在模型中:

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

在我的控制器上,我创建了一个函数来检查新字段的存在,然后将 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,希望对您有所帮助!

【讨论】:

以上是关于是否有最佳实践/连贯的方法来更新包含哈希键值存储的数据库字段?的主要内容,如果未能解决你的问题,请参考以下文章

部署高性能 Berkeley DB 系统的最佳实践

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

Metal 最佳实践:三重缓冲 – 纹理?

在 mysql 中有效存储 md5 哈希的最佳实践

源代码管理最佳实践 - 定期从存储库更新工作副本

雄辩的条件更新