代码之家  ›  专栏  ›  技术社区  ›  thomasfedb

重写SQL查询以处理heroku

  •  2
  • thomasfedb  · 技术社区  · 14 年前

    如何重写这个rails查询以在Heroku(Portegres)上运行

    @students = Student.find(:all, 
                      :conditions =>["(concat(first_name, ' ', last_name) LIKE ?) OR
                                      (concat(first_name, ' ', middle_names, ' ', last_name) LIKE ?)",
                                     "%#{params[:search]}%", "%#{params[:search]}%"]
                            )
    
    4 回复  |  直到 14 年前
        1
  •  0
  •   maček    14 年前

    使用没有意义 concat()

    where (first_name || last_name LIKE ?) 计算结果为

    first_name 计算结果为 true 哪里 last_name 包含搜索词“

    这会让你得到预期的结果

    Student.all(
      :conditions => ["
        first_name like :search ||
        last_name like :search  ||
        middle_names like :search
        ",
        {:search => "%#{params[:search]}%"}
      ]
    )
    

    这将匹配上的所有行 students params[:search] 在他们名字的任何部分。

        2
  •  5
  •   Jesse Wolgamott    14 年前

    也遇到了这个问题。Postgres对于LIKE操作符是区分大小写的,下面是我在一个项目中所做的。另外,我不喜欢在本地运行postgres,所以我让它在开发中使用like(mysql/sqlite)和在生产中使用ILIKE(postgres)。ILIKE是“不区分大小写的like”

      DATABASE_OPERATOR = {
        :like_operator => "LIKE"
      }
    

    /配置/environments/production.rb

      DATABASE_OPERATOR = {
        :like_operator => 'ILIKE' #postgres awfulness
      }
    

    @students = Student.find(:all, :conditions => ['(concat(first_name, " ", last_name) #{DATABASE_OPERATOR[:like_operator]} ?) OR (concat(first_name, " ", middle_names, " ", last_name) #{DATABASE_OPERATOR[:like_operator]} ?)', "%#{params[:search]}%", "%#{params[:search]}%"])
    
        3
  •  1
  •   Frank Heikens    14 年前

    使用管道| |而不是CONCAT,这是标准SQL:

    @students = Student.find(:all, :conditions => ['(first_name || last_name LIKE ?) OR (first_name || middle_names || last_name LIKE ?)', "%#{params[:search]}%", "%#{params[:search]}%"])
    

    同时检查引号,字符串需要单引号,数据库对象需要双引号。MySQL接受这两者,根据配置的不同,其他数据库只接受标准。

        4
  •  0
  •   Salil    14 年前

    Student.find(:all, 
                      :conditions =>["(concat(first_name, ' ', last_name) LIKE :text) OR
                                      (concat(first_name, ' ', middle_names, ' ', last_name) LIKE :text)",
                                     {:text=>"%#{params[:search]}%"]
                            )