2017-07-03 85 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数组字段将为这两个文件提供相同的索引。你需要照顾他们何时被删除。