以rails形式存储和检索postgres嵌套的JSONB数据类型

时间:2016-05-21 11:35:54

标签: ruby-on-rails json forms postgresql jsonb

我意识到没有太多关于如何使用rails表单来存储和检索JSON类型数据的信息。我目前面临以下问题:

我有一个在JSON中创建嵌套结构的表单:

= form_for(@car) do |cf|
    = cf.fields_for :locations do | locations_f |
        = locations_f.fields_for :primary_location do | primary_location_f |
            .sm-col.md-col.sm-col-6.px2
                label.inline-block.mb1 District
                = primary_location_f.text_field :district 
            .sm-col.md-col.sm-col-6.px2
                label.inline-block.mb1 Street
                = primary_location_f.text_field :street 

它将生成输入HTML标记:

<input name="car[locations][primary_location][district]">

<input name="car[locations][primary_location][street]">

我可以在执行params.permit后将其保留在数据库中:

params.require(:car).permit([
    locations:[primary_location:[:street, :district]]
])

我还在模型

中创建store_accessor
store_accessor :locations, :primary_location, :other_locations

但是,在我持久保存数据后,我希望它显示在text_field数据库中已经存在的内容中。我尝试做类似的事情:

= primary_location_f.text_field :district, value: @car.locations['primary_location']['district']

但是,它会遇到NilClass错误,因为有时@car.locations['primary_location']可能为零,当我调用@car.locations['primary_location']['district']时会出现错误。

我想知道存储和检索JSON数据类型的最佳方法是什么。嵌套JSON时有什么好方法。

由于

1 个答案:

答案 0 :(得分:1)

  

然而,它会遇到NilClass错误,因为有时@ car.locations ['primary_location']可能是nil,当我调用@ car.locations ['primary_location'] ['district']时会出现错误。

使用.try()方法。

@car.locations.try(:[],:primary_location).try(:[], :district)
  

我想知道存储和检索JSON数据类型的最佳方法是什么。当JSON嵌套时,有什么好方法。

我更喜欢内置JSON store。与你正在使用的相似。