Rails:如何find_by包含特定字符串的字段

var*_*tis 60 sql ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

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

所以说我有一个我正在寻找的术语,苹果.

如果我做了

Topic.find_by_name("apple")
Run Code Online (Sandbox Code Playgroud)

我得到一个名为apple的记录.这很好 - 但是如何更改find​​_by_name以便它可以找到"apple juice"以及"apple" - 基本上,找到包含原始查询的名称或者与原始查询完全匹配?

编辑: 感谢您的所有回复.我想我之前应该更清楚一点,但是如果我想通过变量名来找到(显然我不想每次都找到名字"apple"):))?

我如何操纵Topic.where来适应这个?所以像......

@topic = Topic.where(......., @name)
Run Code Online (Sandbox Code Playgroud)

Del*_*man 120

我认为这样的事情应该有效:

Topic.where("name like ?", "%apple%")
Run Code Online (Sandbox Code Playgroud)

为了适应您的编辑:

Topic.where("name like ?", "%#{@search}%")
Run Code Online (Sandbox Code Playgroud)

基本的字符串插值,你正在使用@search字符串内部的值%%,所以@search = "apple"你最终得到了 %apple%

  • 只要使用?,Rails就会阻止SQL注入。如上所示的参数。如果您改为“像%@ search%这样的名字”,那么您将保持开放状态。 (3认同)
  • @bkunzi01 是正确的,如 https://guides.rubyonrails.org/active_record_querying.html#array-conditions 和 https://guides.rubyonrails.org/security.html#sql-injection 中所述 (3认同)
  • 您是否认为此方法导致SQL注入? (2认同)
  • 据我所知[这里](http://rails-sqli.org/),`where`方法无法防止SQL注入.但是,只有通过考虑该变量是否通过存储的未标定值或直接暴露给用户输入,才能真正回答这个问题.那应该是感兴趣的问题.反对SQL注入的最佳方法是在应用程序输入时清理值,甚至在存储之前. (2认同)

Sco*_*hea 10

看起来在Rails 3中你会想要使用where:

Topic.where("name ILIKE ?", "%apple%")
Run Code Online (Sandbox Code Playgroud)

  • `〜=`运算符适用于PostgreSQL - 它是一个正则表达式匹配.但是,斯科特的答案应该有效.您可能希望使用ILIKE,它提供不区分大小写的搜索. (5认同)

Ali*_*kov 8

不要像这样直接放置字符串.它叫做SQL注入.您应该使用.where:

Topic.where("name like '?%' ", params[:name])
Run Code Online (Sandbox Code Playgroud)

  • 这不会完全按照说明工作,因为Rails会自动引用字符串.你需要在替换之前使用'%`,例如`Topic.where("name like?","#{params [:name]}%"). (3认同)

Szy*_*Rut 8

使用PostgreSQL,您还可以使用匹配运算符:

Topic.where("name ~* ?", @search)
Run Code Online (Sandbox Code Playgroud)