【问题标题】:Ruby PG gem select field in array formatRuby PG gem 选择数组格式的字段
【发布时间】:2019-12-27 22:27:59
【问题描述】:

我有一个 postgresql 字段,它存储一个 4 元素 array。我想选择该字段的值,但它以string 的形式返回:

{43.690916,-79.396774,43.700845,-79.37125}  

我假设gem 会知道该字段的格式并返回array,但我错了。

如何在不通过 string 方法的情况下将其放入 array 中?这似乎是一个黑客行为。从四个单独的 float 字段移动到具有关联方法的单个 array 字段,我认为这会使记录更易于访问。

没有迁移,并且限制性地假设这是在 Rails 中,但事实并非如此。这是结构:

Column   |          Type          | Collation | Nullable |                  Default
-----------+------------------------+-----------+----------+-------------------------------------------
 loc_id    | integer                |           | not null | nextval('mjtable_loc_id_seq'::regclass)
 locname   | character varying(255) |           |          |
 locbounds | double precision[]     |           |          |

【问题讨论】:

  • 将 4 个值存储到关系数据库的单个字段中看起来非常错误。违反en.wikipedia.org/wiki/First_normal_form。由于您没有解释的原因不能使用字符串方法,如果值在所有列中具有相同的格式和长度,也许可以考虑使用SUBSTR() PG 方法从数据库中提取数据?
  • 该字段是GPS 区域的边界。所以两个lat/lon 组合。我应该把它移到hstore 吗?像这样使用 4 个字段作为浮点数只是感觉很奇怪。
  • 您能否更新问题以包含您用于创建字段的迁移?
  • @Rich_F 查看我的更新答案。我认为这仍然适用于您的用例。

标签: arrays ruby postgresql pg


【解决方案1】:

在 Postgres 中,数组在数据库中仍然是一个字符串,所以你只会有一个字符串,你需要像这样处理它。

conn = PG.connect( dbname: 'pgarray_development') # or whatever db name
data = conn.exec('SELECT * FROM foos').entries
=> [{"id"=>"1", "coords"=>"{1.0,2.0,3.0,4.0}"]
data.first['coords'].class
=>String

但你可以这样做

conn.type_map_for_results = PG::BasicTypeMapForResults.new conn
conn.exec("select coords::float[] from foos").values
=> [[1.0, 2.0, 3.0, 4.0]]

可能还有其他使用类型转换的方法,请参阅https://bitbucket.org/ged/ruby-pg/wiki/Home

【讨论】:

  • 他在原始问题中没有提到rails。可能是一个错误,不确定。
  • 这不是Rails。当人们意识到Ruby != Rails 时会很好。但是很高兴知道PostgreSQL中这个字段是一个string,并且确实只是为了存储,用于检索后的后续逻辑。
  • @Rich_F 是的,我更新了我的答案以显示非 Rails 方式
  • 是的,这不是一个真正的解决方案。它有效,但我希望有理由将field 实现为array。我目前正在调查hstore
  • 查看更新的答案,您可以将数组转换为浮点数
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2015-08-05
  • 2017-01-03
  • 2023-03-06
  • 2013-01-13
  • 2017-01-11
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多