Hstore + Rails访问hstore列中的所有可能字段

时间:2014-05-28 18:27:11

标签: ruby-on-rails ruby postgresql hstore

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

=== TIME 0中的背景

  1. 我有一个User模型的应用程序。此模型有一个名为info
  2. hstore
  3. info打算存储密钥['name', 'first_surname', 'phone']。此外,还使用store_accessor :name, :first_surname, :phone
  4. 创建了几个用户,填写了这三个字段。假设我们有10个这样的用户。
  5. 当我想显示用户的个人资料时,我这样做:
  6. (这会在表格中呈现用户表格的每个字段,包括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. 我将这些新字段作为键/值对存储在info的{​​{1}}列中。
    3. 每当有新的注册时,注册表单会显示这三个字段(User),因此用户可以填写它们。
    4. 当我想渲染最近创建的用户的个人资料时,参考文献“PROFILE SHOW”(见上文)中使用的代码效果很好。
    5. 问题:在上下文 TIME 0 期间,如何修改代码“PROFILE SHOW”,使其与前10个创建的city,province,passport一起使用。以这种方式呈现页面

      User

      即。上下文 TIME 0 期间|province | | |city | | |passport | | 中不存在的字段中的空格。

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

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

      到目前为止我的方法:

      • 将所有字段保存在数组中,并在控制器方法中实例化它,然后更改“PROFILE SHOW”代码:
      hstore
      • 执行相同的操作,但将该属性数组保留在某种全局变量/缓存中,该变量/缓存在控制器方法中读取,并分配给实例变量。

      谢谢!

1 个答案:

答案 0 :(得分:1)

  

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

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

如果您希望定义已知密钥的列表,您的应用程序必须使用可能密钥的边表维护其自身,可以是单个行,也可以是单个hstore字段,每个键都指向一个虚拟密钥占位符价值。我推荐单独的行以获得更好的并发性。