簡體   English   中英

Rails,將數組提交給postgres

[英]Rails, submitting array to postgres

我有一個 Rails API,我試圖將一個數字數組傳遞給我的 postgres 數據庫,但我不能:我發送一個包含兩個值的數組,它接受一個只有第一個值的數組。

我有 2 個模型, ItinaryEvent ,其中:

class Event 
  belongs_to: itinary
  accepts_nested_attributes_for :itinary

class Itinary
   has_many: events

我使用 Postgres 和一個 React 前端和 Rails API 和 Postgres。 如果類型為decimal ,我聲明了一列類型為array的列:

  • Rails Postgres 架構:我將DECIMAL設置為類型:
create_table "itinaries", force: :cascade do |t|
    ...
    t.decimal "start_gps", default: [], array: true
  • Rails EventsController :沒什么花哨的,從Event controller,create方法是: Event.new(event_params) ,strong params方法也比較簡單:
def event_params
   params.require(:event).permit( 
      ...,
      itinary_attributes: [...,  start_gps: [] ],
      ...
   )
end

我檢查了Event.first.itinary.start_gps.class返回Array 我可以使用Itinary.create.(..,: start_gps,[45,1]) (值是數字)。

  • React 表單:數據是在 React 的FormData中發送的,我相信我使用了正確的 Rails 命名約定:
const fdata = new FormData()
fdata.append("events[itinary_attributes][start]", itinary.start)
fdata.append("events[itinary_attributes][start_gps][]", itinary.start_gps)
...

所以我的 POST 請求的 header 包含:

event[itinary_attributes][start_gps][]: 45.1936513315257,0.6646728515625

提交時,我得到了幾乎所需的參數,但引用了數組中的值:

 Parameters: 
{"event"=>{
   "itinary_attributes"=>{
       "date"=>"2020-08-16",
       "start"=>"Paris FRA",
       "start_gps"=>["48.85011347181819,2.3353889957070355"], << one value ?
       }
   }
}

這樣我在 Postgres 觸發時只得到第一個值:

 Itinary Create (2.5ms)  
INSERT INTO "itinaries" ...
  ["start_gps", "{48.85011347181819}"], <<<<< ONLY FIRST
                   ^^
]
  • 如果我將t.stringt.text設置為模式中的數據類型,Postgres 會觸發:
Itinary Create (2.5ms) 
 ["start_gps", "{\"45.18978009667531,0.6811523437500001\"}"]]

所以Event.last.itinary.start_gps.length返回 1,一個連接的值:

start_gps: Array(1)
=> "45.158800738352106,1.5051269531250002"

我什至嘗試從 React 提交一個字符串數組,但沒有成功。 從哪兒開始? 我相信這是非常經典的東西。 看起來 Rails 或 Postgres 無法讀取分隔數組中兩個值的逗號 ','。

你可能想試試這個:

const fdata = new FormData()
fdata.append("events[itinary_attributes][start]", itinary.start)
fdata.append("events[itinary_attributes][start_gps][]", itinary.start_gps[0])
fdata.append("events[itinary_attributes][start_gps][]", itinary.start_gps[1])

這應該讓你

{"event"=>{
  "itinary_attributes"=>{
    "date"=>"2020-08-16",
    "start"=>"Paris FRA",
    "start_gps"=>["48.85011347181819", "2.3353889957070355"] <-- Two values in an array
   }

如果有任何興趣,可以“手動”解決這個問題:為了將一組數字保存到一個數組字段中,我拆分了接收到的參數。 這是不能令人滿意的,因為如此簡單的工作需要如此多的手勢。 我仍然不明白有什么問題。

一種解決方案是添加 controller:

if params[:event][:itinary_attributes][:start_gps]
      params[:event][:itinary_attributes][:start_gps] = params[:event][:itinary_attributes][:start_gps][0].split(',')
end

event_params = params.require(:event).permit( 
   ...,
   itinary_attributes: [...,:start, start_gps: [], end_gps: []],  
   ) 
Event.new(event_params)
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM