2017-07-03 160 views
0

我正在創建文件上傳器,除了存儲多個文件到s3使用霧也需要存儲額外的信息,如文件名等每個文件。Carrierwave json列與元數據

由於一行的文件數量可能會有所不同我想將這些數據以json的形式保存在我的數據庫表中。但是,默認情況下,carrierwave僅存儲上傳文件的url。

的Json會有類似這樣的結構:

{ 
    { 
     url: ..., 
     name: ... 
    }, 
    { 
     url: ..., 
     name: ... 
    } 
} 

有沒有人嘗試這樣做,以及如何將一個去了嗎?

+0

你是要求多個文件存儲還是隻爲元數據(網址,名稱)? –

+0

我需要多個文件存儲,但每個文件都有獨立的文件字段,並且需要一起添加少量附加文本字段。因此,包含文件和文本字段的每個組都是我的表列中的一個嵌套json。 – user3454914

回答

0

我會implemente,要麼有一個回調(如果它被調用爲每個文件)或進程(如果回調函數被調用一次爲所有文件),對上傳:

Carrierwave Callbacks

your_uploader.rb 

after :store, :save_json_info 

process :save_json_info 


def save_json_info 
    info = model.json_field 
    info[filename] = { 
    url: ..., 
    name: ... 
    } 
    model.update!(json_field: info) 
end 

(上傳你內心真正的基準而被保存爲文本model模型)

然後,你可以通過 訪問它們(外你會替代型號爲它的實際名稱...)

name = model.avatar[0].file.filename 

name = model.avatar[0].split('/')[-1] #this is a hacky way of getting the filename, by splitting the url address and getting the last element of the split 

model.json_field[name] 

(我不知道這是正確的方式來訪問carrierwave上的多個文件,但無論它是什麼樣的應該是類似的)

編輯: 也許最好的辦法是讓json字段是一個數組,以及在處理文件時,在該字段上簡單地使用< < {url:'...',name:'....'}。然後當你循環遍歷文件來顯示它們時,你可以循環索引並獲取相應的json值。所以,在你上傳

你會:

def save_json_info 
    model.json_field << { 
    url: ..., 
    name: ... 
    } 
    model.save! 
end 

然後,如果你通過圖片循環,.each_with_index例如,你可以使用索引來訪問model.json_field [1]。由於我想象文件將在處理數組文件時被添加到數組文件中,因此將它們推入同一循環中的info_json數組字段將爲這兩個文件提供相同的索引。你需要照顧他們何時被刪除。