Rails: How to find_by a field containing a certain string
我有一个名为Topic的模型,该模型具有一个名称作为字段。
所以说我要搜索的术语是苹果。
如果我做
1
| Topic.find_by_name("apple") |
我得到了一条记录,名字叫苹果。很好-但是如何更改find??_by_name以便它既可以找到"苹果汁"也可以找到"苹果汁"-基本上是,找到包含原始查询或与原始查询完全匹配的名称?
编辑:
感谢您的所有回复。我想我本来应该更清楚一点,但是如果我想用一个变量名来查找(显然我不想每次都用" apple"来查找:))怎么办?
我如何操纵Topic.where以适应这一情况?
所以像...
1
| @topic = Topic.where(......., @name) |
- 在我的答案中添加了与您的最新编辑相关的编辑,如果有帮助,请告诉我!
-
请参阅我对@Alisher答案的评论,以获取对已编辑问题的答案。 Topic.where("name like ?","#{@name}%")是一种方法。
我认为类似的方法应该起作用:
1
| Topic.where("name like ?","%apple%") |
要适应您的编辑:
1
| Topic.where("name like ?","%#{@search}%") |
基本字符串插值,您正在字符串%%中使用@search的值,所以您@search ="apple"然后以%apple%
结尾
- 您是否认为此方法导致SQL注入?
-
据我所知,where方法没有采取任何措施来防止SQL注入。但是,只有通过考虑该变量是否曾通过存储的未经过消毒的值或直接通过用户输入暴露,才能真正回答问题。那应该是感兴趣的问题。抵销SQL注入的最佳方法是在应用程序进入(甚至在存储之前)清理值。
-
不包含某个字符串怎么办?
-
只要使用?,Rails就会阻止SQL注入。如上所示的参数。如果您改用"像%@ search%这样的名字",那么您将保持开放状态。
-
@ bkunzi01是正确的,如guides.rubyonrails.org/…和guides.rubyonrails.org/security.html#sql-injection中所述
在PostgreSQL中,您还可以使用匹配运算符:
1
| Topic.where("name ~* ?", @SEARCH) |
不要那样直接放置字符串。它称为SQL注入。您应该改用.where:
1
| Topic.where("name like '?%'", params[:name]) |
-
应该是"像'?%'之类的名称"还是"像'%?%'之类的名称"
-
这将无法完全按照说明的方式工作,因为Rails会自动引用该字符串。您需要在替换前添加%,例如Topic.where("name like ?","#{params[:name]}%").
-
漂亮的答案。 ??
就像在Rails 3中一样,您想使用where:
1
| Topic.where("name ILIKE ?","%apple%") |
-
不知道这是否行得通-是"?="有效的sql吗?还是您在考虑ruby模式匹配器" =?"。如果是这样,它将无法在这里工作,因为它不是sql
-
是的,我注意到在我所引用的帖子中,只是以表面的价值而接受...我将改为喜欢,并且很安全。谢谢!
-
~=运算符适用于PostgreSQL-这是一个正则表达式匹配项。但是,是的,斯科特的答案应该起作用。您可能要使用ILIKE,它提供不区分大小写的搜索。
尝试
1 2
| Topic.where("name like ?",'%apple%')
Topic.find(:ALL, :conditions => ["name like ?","%apple%"]) |
-
第一个示例中的SQL注入应为Topic.where("name like ?","%apple%")。第二个人没关系。
-
您也可以在Rails 4中执行此操作:Topic.find_by("name like ?","%apple%")