【问题标题】:Hstore+Rails Access all the possible fields in a hstore columnHstore+Rails 访问 hstore 列中所有可能的字段
【发布时间】:2014-07-18 02:57:36
【问题描述】:

注意:这个问题的表述试图模拟一个应用程序的时间演变。因此,每个上下文都是前一个上下文的演变,也就是在迭代之后添加了字段/功能

=== TIME 0 中的上下文

  1. 我有一个User 型号的应用程序。该模型有一个名为infohstore
  2. info 列打算存储密钥['name', 'first_surname', 'phone']。也使用store_accessor :name, :first_surname, :phone
  3. 创建了几个用户,填充了这三个字段。假设我们有 10 个这样的用户。
  4. 当我想显示用户的个人资料时,我这样做:

(这会将用户表的每个字段呈现在一个表中,包括info hstore 列中的所有字段。)

Reference:"PROFILE SHOW"

#app/views/users/profile.html.erb
<h3>Profile</h3>

  <table class="table table-striped">
    <tbody>
      <tr><th>Email</th><th><%=current_user.email%></th></tr>
      <% unless current_user.info.nil? %>
        <% current_user.info.each do |key,val| %>
          <tr>
            <th><%=key.gsub('_',' ').titleize%></th>
            <th><%=val%></th>
          </tr>
        <% end %>
      <% end %>
    </tbody>
  </table>

=== TIME 1 中的上下文

  1. 现在我决定为每个用户存储cityprovincepassport
  2. 我会将这些新字段作为键/值对存储在Userinfo 列中。
  3. 每当有新的注册时,注册表单都会显示这三个字段 (city,province,passport),以便用户填写。
  4. 当我想呈现最近创建的用户的个人资料时,Ref.“PROFILE SHOW”(见上文)中使用的代码效果很好。

问题:如何修改代码“PROFILE SHOW”,使其在上下文 TIME 0 期间也适用于创建的前 10 个 User。以这样的方式呈现页面

|province |     |
|city     |     |
|passport |     |

即在上下文 TIME 0 期间 info 中不存在的那些字段的空白。

换句话说:如何跟踪hstore 列中的“潜在”字段,即存在于其他实例中但不存在于您的实例中的字段。

这是可取的,因为我也想在编辑页面中显示它们,以便用户可以填写以前不存在的字段。

到目前为止我的方法:

  • 将所有字段保存在一个数组中,并在控制器方法中实例化,然后更改“PROFILE SHOW”代码:
#app/controllers/users_controller.rb
def profile
  @info_attributes=%w(name first_surname phone passport city province)
end

#app/views/profile.html.erb
<% @info_attributes.each do |key| %>
 ...
<% end %>
  • 做同样的事情,但将该属性数组保存在某种全局变量/缓存中,该变量在控制器方法中读取,并分配给实例变量。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby postgresql hstore


    【解决方案1】:

    如何跟踪 hstore 列中的“潜在”字段,即存在于其他实例中但不存在于您的实例中的字段

    没有直接的方法,因为hstore 只是作为字段值的键/值存储。它与任何其他hstore 值没有关系。

    如果您希望定义一个已知键的列表,您的应用程序必须通过一个可能的键的侧表来维护其自身,或者作为单独的行或作为单个 hstore 字段,每个键指向一个虚拟占位符值.我推荐单独的行以获得更好的并发性。

    【讨论】:

    • 我担心是这样的:(对我建议的方法有什么想法吗?
    • 我的 Rails-fu 非常缺乏,几乎不存在。我会将它在数据库中建模为一个单独的关系,用作候选键的查找表。如果我用一种熟悉的语言实现它,我可能会在启动期间将该候选键表读入内存并将其缓存为内存中的数组以呈现在用户界面中。我还添加了一个选项来禁用/隐藏候选键,因此它不再列出,并且可能会添加基于 listen/notify 的警报到知道在键列表更改时更新其缓存的长期运行的进程。
    • 感谢您的建议。由于这是 UserInfo 表,其行确实会被缓存。
    猜你喜欢
    • 2015-08-02
    • 2012-11-25
    • 1970-01-01
    • 2016-12-16
    • 2014-11-09
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多