【发布时间】:2013-07-09 00:15:33
【问题描述】:
我有一个 Rails 4 应用程序,其中的文本字段包含很长的字符串(有时是 10 到数千个字符)。我只想提取索引视图中的前 500 个字符,以提高应用程序的性能。我不确定如何做到这一点,或者即使这是提高性能的最佳方法。请指教。
【问题讨论】:
标签: ruby-on-rails ruby postgresql ruby-on-rails-4
我有一个 Rails 4 应用程序,其中的文本字段包含很长的字符串(有时是 10 到数千个字符)。我只想提取索引视图中的前 500 个字符,以提高应用程序的性能。我不确定如何做到这一点,或者即使这是提高性能的最佳方法。请指教。
【问题讨论】:
标签: ruby-on-rails ruby postgresql ruby-on-rails-4
许多 SQL 语言都支持 LEFT 函数,这是一个返回字符串前 n 个字符的标量值。
例如,在 SQLServer 中,您可以使用
SELECT LEFT(text, 500)
如果数据类型不是 text 或 ntext(两者都已弃用),则此方法有效。
如果你在 Rails 中使用模型,那么你可以使用
MyModel.select("LEFT(COLUMN, 500)")
如果您的 SQL 支持这种类型的函数。确保将其与您的其他值组合到一个 SQL 查询中。
【讨论】:
left 可以在 PostgreSQL 中正常工作,并且不关心数据类型。无论如何,PostgreSQL 中的text 只是varchar 的别名,并且没有ntext(某种SQL Server unicode 类型?)。
对于遇到此问题的其他任何人,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 答案的评论发布,但还没有足够的声誉。)
【讨论】:
您可以尝试仅从 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 之前先尝试一下,看看是否足够。
【讨论】: