[英]Rails, submitting array to postgres
我有一個 Rails API,我試圖將一個數字數組傳遞給我的 postgres 數據庫,但我不能:我發送一個包含兩個值的數組,它接受一個只有第一個值的數組。
我有 2 個模型, Itinary
和Event
,其中:
class Event
belongs_to: itinary
accepts_nested_attributes_for :itinary
class Itinary
has_many: events
我使用 Postgres 和一個 React 前端和 Rails API 和 Postgres。 如果類型為decimal
,我聲明了一列類型為array
的列:
DECIMAL
設置為類型:create_table "itinaries", force: :cascade do |t|
...
t.decimal "start_gps", default: [], array: true
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])
(值是數字)。
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.string
或t.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.