【问题标题】:Paginating long text in Rails w/ MySQL在带有 MySQL 的 Rails 中对长文本进行分页
【发布时间】:2011-07-23 01:34:52
【问题描述】:

目前对长文本进行分页的最佳做法是什么,例如将一篇长文章分成多页?

我能想到的两个选项:

  • 将字符串存储在一个长文本列中,将其切片为一个数组并对其进行分页。但是,我担心内存使用和页面加载处理过多。
  • 分割文本并将其存储在页面模型中(文章 has_many :pages)。应该可以正常工作,但我们会失去更改页面长度的灵活性。

最好的方法是什么?我有什么遗漏吗?

【问题讨论】:

  • 文本通常有多长?
  • 最初它需要占至少 20000 字/120000 个字符,但有时可能会比这高一些。

标签: mysql ruby-on-rails ruby pagination


【解决方案1】:

我的建议是采用第一种方法,并将切片结果放入缓存中(如 memcached),这样您就可以灵活地更改页面长度,而不必每次提供页面时都对其进行切片。

【讨论】:

    【解决方案2】:

    如果文本通常小于 10MB,那么在动作中拆分文本是完全合理的。 Rails 的内存开销比这大得多,所以你不必担心。

    但是,如果文本通常超过 10MB,则应直接从数据存储中选择子字符串。例如,如果你使用 MySQL 和 ActiveRecord,你可以这样做:

    # assuming fields `id`, and `body`
    class Article < ActiveRecord
      def self.find_page(id, page_number, page_size = 10_000)
        page_number = page_number.to_i
        page_size = page_size.to_i
        pos = page_size * (page_number - 1)
        # http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring
        find(id, :select => "id, SUBSTRING(body, #{pos}, #{page_size}) AS body")
      end
    end
    

    (当然,10MB 是一个任意数字。选择一个适合你的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多