Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails:如何通过包含特定字符串的字段查找__Sql_Ruby On Rails_Ruby On Rails 3_Ruby On Rails 3.1 - Fatal编程技术网

Sql Rails:如何通过包含特定字符串的字段查找_

Sql Rails:如何通过包含特定字符串的字段查找_,sql,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.1,Sql,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.1,我有一个名为Topic的模型,它的名称作为字段 假设我有一个我正在寻找的术语,苹果 如果我做一个 Topic.find_by_name("apple") 我得到了一张苹果唱片。这很好——但是我如何更改find_by_name,以便它可以找到“apple juice”和“apple”——基本上,找到包含原始查询或与原始查询完全匹配的名称 编辑: 谢谢你的回复。我想我之前应该更清楚一点,但是如果我想通过变量名来查找(显然我不想每次都通过名称“apple”来查找:) 我该如何处理Topic.wher

我有一个名为Topic的模型,它的名称作为字段

假设我有一个我正在寻找的术语,苹果

如果我做一个

Topic.find_by_name("apple")
我得到了一张苹果唱片。这很好——但是我如何更改find_by_name,以便它可以找到“apple juice”和“apple”——基本上,找到包含原始查询或与原始查询完全匹配的名称

编辑: 谢谢你的回复。我想我之前应该更清楚一点,但是如果我想通过变量名来查找(显然我不想每次都通过名称“apple”来查找:)

我该如何处理Topic.where来适应这个问题? 所以有点像

@topic = Topic.where(......., @name)

我认为这样做应该奏效:

Topic.where("name like ?", "%apple%")
要适应您的编辑,请执行以下操作:

Topic.where("name like ?", "%#{@search}%")
基本字符串插值,您在字符串
%%
中使用
@search
的值,因此您
@search=“apple”
,然后以
%apple%
结束

Topic.where("name like ?",'%apple%')
Topic.find(:all, :conditions => ["name like ?","%apple%"])
在中,您可能希望使用where:

Topic.where("name ILIKE ?", "%apple%")

不要那样直接放线。它被称为SQL注入。您应该改为使用
。其中

Topic.where("name like '?%' ", params[:name])

使用PostgreSQL,您还可以使用:


不确定这是否有效-“~=”是有效的sql吗?或者您正在考虑ruby模式匹配器“=~”。如果是这样的话,它在这里就不起作用了,因为它不是sqlYeah。我注意到在我引用的帖子中,它只是从表面上看。。。我会变得喜欢并且安全。谢谢
~=
操作符适用于PostgreSQL——它是正则表达式匹配。但是是的,斯科特的答案应该有用。您可能需要使用ILIKE,它提供了不区分大小写的搜索。这应该是“类似于“?%”的名称”还是“类似于“?%”的名称。这将无法完全按照说明工作,因为Rails将自动引用字符串。您需要在替换之前添加
%
,例如
主题。where(“name like?”,“#{params[:name]}%”。
漂亮的答案。第一个示例中的SQL注入应该是
主题。其中(“name like?”,“%apple%”)
。第二个没问题。您也可以在Rails 4+中执行此操作:
主题。查找方式(“类似名称?”,%apple%”
为我的答案添加了一个与您最新编辑相关的编辑,如果有帮助,请告诉我!请参阅我对@Alisher答案的评论,以了解您编辑的问题的答案<代码>主题。where(“name like?”,“#{@name}%”将是一种方法。您认为这种方法会导致SQL注入吗?据我所知,
where
方法对SQL注入没有任何保护作用。然而,只有考虑变量是否曾经通过存储的未初始化值或直接暴露给用户输入,才能真正回答这个问题。这应该是人们感兴趣的问题。阻止SQL注入的最佳方法是在应用程序输入时,甚至在存储之前,对值进行清理。不包含特定字符串如何?只要使用,Rails就会阻止SQL注入?对于如上所示的参数。如果您改为“像%@search%那样命名”,您将保持打开状态。@bkunzi01是正确的,如和中所述
Topic.where("name ~* ?", @search)