【问题标题】:Complex search screens in Rails 3Rails 3 中的复杂搜索屏幕
【发布时间】:2011-10-25 13:42:38
【问题描述】:

我需要在 Rails 应用程序中实现一些搜索功能。我发现的大多数东西通常都是针对简单的纯文本搜索的。我正在尝试实现更具体的东西。我希望创建的功能是这样的(来自 C 应用程序):

http://andyc.ac/query.gif

表单只是提交用户输入的数据。因此,我需要将诸如“3..7”之类的字符串转换为 where 方法的 SQL 条件,例如

TestLine.where( "test_int >= ? and test_int <= ?", MinInt, MaxInt )

这似乎是某处已经存在的东西。预期的确切格式不太重要,因为用户不会在 Rails 和 C 应用程序之间共享。这将如何实现?

【问题讨论】:

  • 为什么不在你的模型中使用作用域?
  • 包含图表的很棒的问题。 +1

标签: ruby-on-rails ruby search


【解决方案1】:

FWIW 您描述的特定功能实际上是直接支持的。嗯..几乎。来自the docs

可以在哈希中使用范围以使用 SQL BETWEEN 运算符:

Student.where(:grade => 9..12)

当然,这只是将用户的字符串输入转换为 Range 的问题,这不是很复杂,例如:

def str_to_range str
  str =~ /(\d+)\.\.(\d+)/

  Range.new *$~.captures.map(&:to_i)
end

在您的模型上使用scope 可能最有意义。 (当然,一个捷径是简单地eval '9..12',但eval来自最终用户的输入是一个非常非常糟糕的主意。)

【讨论】:

  • 谢谢,我也在调查这个问题:我有点犹豫是否要从 C 应用程序重写查询库中的数千行代码,但是当我尝试时,似乎我需要几页代码!
  • 这看起来像我要采用的方法。我发现 SQLite 不喜欢字符串字段上的 BETWEEN 子句(我们有很多字段是字符串,但大多是数字)所以我要切换数据库来解决这个问题。
  • 这样做要小心,因为字符串比较和数字比较的行为通常不同。所以虽然5 可能是BETWEEN 1 AND 10'5' 可能是也可能不是BETWEEN '1' AND '10'(想想数学与字母顺序)。一种解决方法是将字符串转换为数字,例如BETWEEN CAST(str_val AS INT) AND CAST(other_str_val AS INT)。这可能会为您省去切换数据库平台的麻烦。
  • 好点,但主要是数字,我的意思是像'M37012883'这样的字符串(所以它不会转换)。在大多数数据库上,您可以运行 BETWEEN 'M37012883' AND 'M37012921' 并查看该范围内的 ID,这对于通配符字符串搜索来说很难做到。
【解决方案2】:

看看会思考的狮身人面像(http://freelancing-god.github.com/ts/en/)。它可能会使您的任务更容易。您可以在其中搜索: http://freelancing-god.github.com/ts/en/searching.html#basic

【讨论】:

  • 谢谢,我正在调查这个。它看起来不错,但我不确定它是否真的经过优化以允许在每个模型的每个字段上进行搜索。
猜你喜欢
  • 2011-05-03
  • 2012-02-15
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多