ruby-on-rails - Rails ActiveRecord - 搜索多个属性

标签 ruby-on-rails ruby-on-rails-3 search activerecord sql-injection

我正在实现一个简单的搜索功能,它应该检查用户名、姓氏和名字中的字符串。我在旧的 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/

相关文章:

javascript - Rails 页面 JS 在真实浏览器/手动测试中有效,但在 PhantomJS 和 Selenium 规范中无效

ruby-on-rails - 如果我使用:without_protection=>true when creating a new model in rails 3. 1会发生什么?

mysql - 机车用mysql

Eclipse Maven 依赖项未找到

regex - 如何创建匹配两个或多个特定完整单词的正则表达式?

使用文本搜索查找所有可能结果的算法

mysql - Rails - 连接表不会自动填充

ruby-on-rails - RoR3+Mongoid : How to compare fields of collection/table when querying?

ruby-on-rails-3 - Resque-scheduler 加载计划但不排队

ruby-on-rails - 急切加载 Paperclip 的 has_attached_file 数据?