【问题标题】:How to pull only part of a text field from DB in Rails 4如何在 Rails 4 中仅从 DB 中提取部分文本字段
【发布时间】:2013-07-09 00:15:33
【问题描述】:

我有一个 Rails 4 应用程序,其中的文本字段包含很长的字符串(有时是 10 到数千个字符)。我只想提取索引视图中的前 500 个字符,以提高应用程序的性能。我不确定如何做到这一点,或者即使这是提高性能的最佳方法。请指教。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql ruby-on-rails-4


    【解决方案1】:

    许多 SQL 语言都支持 LEFT 函数,这是一个返回字符串前 n 个字符的标量值。

    例如,在 SQLServer 中,您可以使用

    SELECT LEFT(text, 500) 
    

    如果数据类型不是 text 或 ntext(两者都已弃用),则此方法有效。

    如果你在 Rails 中使用模型,那么你可以使用

    MyModel.select("LEFT(COLUMN, 500)")
    

    如果您的 SQL 支持这种类型的函数。确保将其与您的其他值组合到一个 SQL 查询中。

    【讨论】:

    • 谢谢!我正在使用postgresql,它确实支持left,但如果可能的话,我希望找到更多的Rails方式来做到这一点。如果根本没有,我会接受这个答案。
    • left 可以在 PostgreSQL 中正常工作,并且不关心数据类型。无论如何,PostgreSQL 中的text 只是varchar 的别名,并且没有ntext(某种SQL Server unicode 类型?)。
    • ntext 是文本的旧 unicode 版本,如果我对此正确的话。它可能只是 SQLServer;我不太确定。
    • 这可能是你最好的解决方案;据我所知,Rails 没有“从数据库中获取字段的一部分”的任何抽象概念。
    • 我就是这么想的。只是想确保我没有遗漏什么。 :-) 谢谢大家 - 特别是@JimPedid!
    【解决方案2】:

    对于遇到此问题的其他任何人,Jim Pedid 的答案的语法实际上是:

    MyModel.select("LEFT(COLUMN, 500) as COLUMN")
    

    原因是左函数返回一个名为“LEFT”而不是“COLUMN”的列,除非您的模型包含一个名为“LEFT”的相同类型的属性,否则rails 将不知道如何处理它。再次将列重命名为“COLUMN”可确保 Rails 允许您访问它。希望这可以避免一些不必要的调试。

    我的应用中的其他实时(工作)示例:

    Post.select("id, title, left(body, 100) as body")
    

    (我会将此作为对 Jim Pedid 答案的评论发布,但还没有足够的声誉。)

    【讨论】:

      【解决方案3】:

      您可以尝试仅从 rails 和通过网络发送的数据开始,即

      使用[0..100] 获取子字符串,然后将其作为 html 发送,例如

      irb(main):006:0> Group.first.group_description[0..100]
        Group Load (0.6ms)  SELECT `groups`.* FROM `groups` ORDER BY group_name LIMIT 1
      => "Charting Tools, Gems and Plugins"
      

      这可以让你在破解 sql 之前先尝试一下,看看是否足够。

      【讨论】:

      • 我目前正在使用 rails 的 truncate 方法来确保所有数据都不会发送到客户端,但我想找到一种 Rails 方式来防止它甚至从数据库,如果可能的话。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2017-09-20
      • 2017-06-10
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多