我在rails上的webapp将一些模型对象的参数存储在xml字符串中,因此每当我需要一些关于特定对象的信息时,我就必须解析它的xml字符串。XML的长度很少超过100行。但是,由于我希望优化,我想知道我是否可以将解析后的xml作为nokogiri的对象存储在db中。这是个好主意吗?

最佳答案

尽管可能有例外,但一般来说,除非有很好的理由,否则应避免将marshalled objects直接存储在数据库中。在Nokogiri的情况下,由于@mu太短mentioned,Nokogiri和Marshal不能很好地配合:

doc = Nokogiri::HTML(some_html)
Marshal.dump doc
# => TypeError: no _dump_data is defined for class Nokogiri::HTML::Document

也就是说,Marshal#loadMarshal#dump是核心ruby库的一部分,使用起来非常有趣。下面是一个快速的代码示例,展示了marshal的工作原理,包括一个比较Marshal.loadClass.new的非常基本的基准:
require 'benchmark'

data_string = <<-DATA
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
DATA

class Example
  attr_reader :data

  def initialize(data)
    @data = data
  end
end

example = Example.new(data_string)

dumped = Marshal.dump example
loaded = Marshal.load dumped

puts "String Bytesize: #{data_string.bytesize} vs. Dump Bytesize: #{dumped.bytesize}"
puts "Marshalled object is larger by #{dumped.bytesize - data_string.bytesize} bytes"

Benchmark.bmbm do |x|
  x.report("Marshal.load: ")  { Marshal.load(dumped).data }
  x.report(" Example.new: ")  { Example.new(data_string).data }
end

关于ruby-on-rails - 将nokogiri(或任何内部)对象保存到数据库是否是一个好主意?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17417682/

10-11 03:40