【问题标题】:Trouble storing JSON Object into JSONB column type in Rails在 Rails 中将 JSON 对象存储为 JSONB 列类型时出现问题
【发布时间】:2020-08-28 07:53:45
【问题描述】:

我已经在这个问题上停留了一段时间,我似乎找不到任何解决方案(我已经四处寻找答案,但在这种情况下对我没有任何帮助)

我的模型 Place 中有一个 jsonb 列类型:

t.jsonb :location

我有地图 API 返回这种类型的对象:

data = {lat: 52.13661911521592, lng:12.277604312500014}

那我变成了一个字符串(否则只会返回[object Object]:

JSON.stringify(data)

{"lat":52.13661911521592,"lng":12.277604312500014}

我正在尝试将此对象存储到我的 jsonb 列中,但每次我发布时,rails 都会返回这些参数:

"place"=>{"location"=>"{\"lat\":52.13661911521592,\"lng\":12.277604312500014}"}

我不能像往常一样查询 Place.first.location['lat'],因为它返回的是 => 'lat' 而不是值...

我试过serialize: :location,我试过在参数上做to_json,唯一看起来它可以以某种方式工作的事情是如果我像这样解析参数:

location = JSON.parse(params['place']['location'])
params['place']['location'] = location

但显然它返回blank...

我之前在相同的场景中使它工作(相同的列类型,相同类型的参数和对象),但我使用的是 rails_admin,它做到了:

<%= form.send :hidden_field, field.method_name, value: form.object.location.to_json %>

在发布之前在字符串化的对象上,我似乎无法弄清楚为什么我不能让它再次工作。 (我可以创建一个hidden_field 来访问对象form.object 而不会让它变得太复杂吗?)

提前感谢您的帮助!

【问题讨论】:

  • 这似乎是一个非常复杂的解决方案,而不是仅将坐标存储在两列中,如果您打算将坐标用于地理空间查询,则会有很大的缺点。
  • 我实际上将它们存储在 2 列中,但由于我只将它们用于 Maps API,我不妨按原样存储它们(在我的情况下,与 Maps 集成实际上更容易)

标签: ruby-on-rails postgresql jsonb


【解决方案1】:

原来我必须允许位置参数作为哈希!

在我的位置控制器中:

  params.require(:place).permit(location: {})

我也在使用与 rails_admin 相同的逻辑来发送表单:

  <%= form.hidden_field :location, value: form.object.location.to_json %>

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 2021-01-27
    • 2015-06-06
    • 2023-02-09
    • 2014-08-06
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多