gpt4 book ai didi

ruby-on-rails - Ruby on Rails 分段构建查询

转载 作者:行者123 更新时间:2023-12-04 06:01:11 26 4
gpt4 key购买 nike

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

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

期待你的回答!

最佳答案

从不,everever 在您的 SQL 中嵌入原始字符串。这是非常糟糕的形式。您应该始终使用 Rails 提供的转义机制或其他类似的机制,以避免陷入严重的麻烦。从 params 插入内容是非常危险的,不应该这样做,因为它只会破坏你的应用程序: { :query => '\"-- DROP TABLE users;' }

一般您使用 helper methods由 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

您可以像这样分阶段构建它,每次就地修改范围,然后执行最终调用以检索它。通常这是您使用分页器拆分结果的时候。

可以在您的选项中放置几乎所有内容,因为它应该在它到达 SQL 阶段时被转义,就像 HTML 端的任何内容也为您转义一样。

不要将 @options 等实例变量与 :query 等符号混淆。两者是非常不同的东西。实例变量具有自动传播到您的 View 的好处,因此它们经常在 Controller 中广泛使用。 View 应尽可能避免根据样式修改它们。

关于ruby-on-rails - Ruby on Rails 分段构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com