【问题标题】:Query multiple tables and columns in Rails and Postgresql with a single search parameter使用单个搜索参数查询 Rails 和 Postgresql 中的多个表和列
【发布时间】:2014-10-22 20:24:59
【问题描述】:

我正在使用带有 Postgresql 数据库的 Rails 构建 API。我有一个 User 模型,users 表有 3 列,emailnamecity

我想创建一个 URL,允许用户在我的 User 模型中搜索多个字段,例如,当用户在以下 URL 中搜索时:

http://localhost:3000/search?term=foo

它在 emailnamecity 列中搜索术语“foo”并返回所有匹配项。这与您在 iTunes Store (http://itunes.apple.com/search?term=foo) 上搜索时类似。

到目前为止,这是我的查询:

SELECT 
  email
  name
  city
FROM
  users
WHERE
  email = '#{term}' OR
  name = '#{term}' OR
  city '#{term}';

这可行,但是当您有很多记录时,它太慢了(>4000 毫秒)。有谁知道可以使这个查询更好的更好的 SQL 或 Rails/ActiveRecord 方法?我已经为所有三列添加了索引。

非常感谢!

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    如果您打算将该代码用于生产目的,那么使用 recommended ?在查询字符串中标记,以避免 SQL 注入。如以下示例所示:

    User.where("email = ? OR name = ? OR city = ?",  params[:term],  params[:term], params[:term])
    

    您问过如何使事情变得更快,数据库索引在这种情况下可能会起作用;所以你需要创建migration file 可以称为 AddIndexes

    class AddIndexes < ActiveRecord::Migration
      def change
         add_index :users, :email
         add_index :users, :name
         add_index :users, :city
      end
    end
    

    【讨论】:

    • 非常感谢关于避免 SQL 注入的建议。至于添加索引部分,我已经为 3 列添加了索引,但是对于某些查询来说仍然很慢(>4000ms)。我在这张表中有大约 300 万条记录,我想这可能太大了。
    • @HarryWang 使用批处理怎么样?我刚刚看了api.rubyonrails.org/classes/ActiveRecord/Batches.html(对我来说也是一个新概念!)和guides.rubyonrails.org/…你可能会发现这个Rails cast也很有用railscasts.com/episodes/202-active-record-queries-in-rails-3所以当使用批处理时,你可以限制在SQL条件中使用的用户数量id 或带有 batch_size。也许这可以加快速度。
    • @HarryWang 关于 SQL,您也可以向数据库管理员的堆栈交换 (dba.stackexchange.com) 询问如何使 SQL 也更快
    • 感谢您关注批次。这很有帮助!非常感谢!!
    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 2013-12-14
    • 2010-10-13
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多