Ruby on Rails构建了查询

Nik*_*dus 3 ruby-on-rails chaining ruby-on-rails-3

之前有一个非常相似的问题,但我仍然很挣扎.是否可以分阶段构建查询?假设我有一个搜索表单,其中包含许多文本和选择字段,这些字段可以链接和/或可以为空白.因此,sql语句应包含为每次搜索单独连接的几个部分.我试图为每个选项创建字符串并将它们放到符号中?(我的意思是@options)并将其放在where子句中(例如Product.where(@options)).这在某种程度上起作用但我在这部分遇到了麻烦:'params [:query]'当它在引号中时.要么我的sql语句说'从产品中选择产品(名称如params [:query]')或者如果我尝试#{params [:query]}它说:从产品中选择产品(其中'name'就像''.)

那么我如何链接查询的不同部分?

我期待着你的回答!

tad*_*man 8

永远,永远,永远在你的SQL中嵌入原始字符串.这是非常糟糕的形式.你应该总是使用Rails提供的转义机制或类似的东西来避免陷入严重的麻烦.从中插入内容params是非常危险的,永远不应该这样做,因为它只需要这个来核你的应用程序:{ :query => '\"-- DROP TABLE users;' }

通常,您使用ActiveRecord提供的帮助程序方法分阶段构建查询:

scope = Product

if (params[:query].present?)
  scope = scope.where([ 'name LIKE ?', "%#{params[:query]}%" ])
end

if (params[:example].present?)
  scope = scope.where(:example => true)
end

@products = scope.all
Run Code Online (Sandbox Code Playgroud)

您可以在这样的阶段构建它,每次都就地修改范围,然后执行最终调用以检索它.通常情况下,当您使用分页器分割结果时.

可以在选项中添加任何内容,因为它应该在它到达SQL阶段时进行转义,就像HTML端的任何内容都被转义一样.

不要混淆实例变量,比如@options:query.这两者是非常不同的东西.实例变量具有自动传播到视图的优点,因此它们通常广泛用于控制器中.视图应该尽可能避免修改它们作为一种风格.

  • @tadman,我想我找到了它.这似乎与控制台有关.当我运行rails c时,会立即触发查询.作为服务器运行时,查询的工作方式与您描述的一样. (2认同)