2015-06-23 5 views
0

Я хочу сохранить небольшой pdf-файл в базе данных mongodb. Я использую Ruby (2.0.0), Padrino (0.12.5) и MongoId (3.0.0), MongoDB (2.6). Поскольку мой размер файла составляет около 1 МБ, мне не понадобится сложность GridFS.Сохраните pdf-файл в mongodb с mongoid без GridFS

Я новичок в MongoDB и ожидал, что небольшие файлы можно легко сохранить, не беспокоясь о путях и файловой системе.

class Client 
    include Mongoid::Document 
    include Mongoid::Timestamps # adds created_at and updated_at fields 

    field :last_name, :type => String 
    field :cv_pdf, :type => Moped::BSON::Binary 
end 

Если я использую тестовый файл в консоли я получаю ошибку, когда я хочу, чтобы сохранить файл в формате PDF в БД:

2.0.0-p353 :015 > c = Client.first 
    => #<Client _id: 55883b5168874459df000001, _type: nil, created_at: 2015-06-22 16:44:01 UTC, 
    updated_at: 2015-06-23 06:45:57 UTC, last_name: "Foo", cv_pdf: ""> 
2.0.0-p353 :016 > f = File.open("test1.pdf") 
    => #<File:test1.pdf> 
2.0.0-p353 :017 > c.cv_pdf = f 
    => #<File:test1.pdf> 
2.0.0-p353 :019 > c.save 
    NoMethodError: undefined method `__bson_dump__' for #<File:test1.pdf> 
    [...] 

ответ

0

Используйте ahoward/mongoid-grid_fs камень, и сохранить GridFS идентификатор файла вместо , Напишите помощник setter и getter, чтобы упростить управление.

class Client 
    field :cv_pdf_id, :type => String 

    def set_cv_pdf(file_path) 
    self.cv_pdf_id = Mongoid::GridFs.put(File.open(file_path)).id 
    self.save 
    end 

    def get_cv_pdf 
    Mongoid::GridFs.get(cv_pdf_id) 
    end 
end 

# Write 
c = Client.new 
c.set_cv_pdf('test1.pdf') 

# Read 
c.cv_pdf  # => #<Mongoid::GridFs::Fs::File:0x007fed8d8b6230> 
c.cv_pdf.data # => Blob data 
+0

Вопрос конкретно говорит «без GridFS». –

+0

Извините, я прочитал это неправильно. – ifyouseewendy

0

Ваша проблема заключается в том, что вы пытаетесь сохранить File экземпляр в MongoDB:

f = File.open("test1.pdf") 
c.cv_pdf = f 

но Mongoid/Мопед/MongoDB знают, что делать с File. Вот почему ошибка NoMethodError с жалобой на недостающий метод __bson_dump__ означает: вы даете Mongoid что-то, что он не знает, как перевести на MongoDB-совместимые данные.

Решение довольно прямо вперед: прочитать файл и дать его содержание Mongoid:

c.cv_pdf = File.read('test1.pdf', :mode => 'rb') 
Смежные вопросы