我正在实现一个简单的搜索功能,它应该检查用户名、姓氏和名字中的字符串。我在旧的 RailsCast 上看到过这个 ActiveRecord 方法:
http://railscasts.com/episodes/37-simple-search-form
find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
但是我该如何让它在名称、姓氏和名字中搜索关键字,并在其中一个字段与该术语匹配时返回记录?
我还想知道 RailsCast 上的代码是否容易发生 SQL 注入(inject)?
非常感谢!
最佳答案
在模型的所有领域进行搜索的更通用的解决方案是这样的
def search_in_all_fields model, text
model.where(
model.column_names
.map {|field| "#{field} like '%#{text}%'" }
.join(" or ")
)
end
或者更好地作为模型本身的范围
class Model < ActiveRecord::Base
scope :search_in_all_fields, ->(text){
where(
column_names
.map {|field| "#{field} like '%#{text}%'" }
.join(" or ")
)
}
end
你只需要这样称呼它
Model.search_in_all_fields "test"
在你开始之前..,不,sql注入(inject)在这里可能不起作用,但仍然更好更短
class Model < ActiveRecord::Base
scope :search_all_fields, ->(text){
where("#{column_names.join(' || ')} like ?", "%#{text}%")
}
end
关于ruby-on-rails - Rails ActiveRecord - 搜索多个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816919/