Ruby如何使搜索过滤器不区分大小写

时间:2015-05-26 05:33:28

标签: ruby-on-rails ruby

我正在构建一个包含搜索字段的应用,如何在我的应用中使搜索过滤器不区分大小写。我可以在下面的代码块中完成此任务:

<div class="filter">
  <%= form_tag posts_path, method: :get do %>
  <%= label_tag :bedrooms %>
  <%= text_field_tag :bedrooms, params[:bedrooms] %>

  <%= label_tag :bathrooms %>
  <%= text_field_tag :bathrooms, params[:bathrooms] %>

  <%= label_tag :neighborhood %>
  <%= text_field_tag :neighborhood, params[:neighborhood] %>

  <%= submit_tag "Search", name: nil %>
  <% end %>
</div> 

以下是来自控制器的相关代码

 class PostsController < ApplicationController
   before_action :set_post, only: [:show, :edit, :update, :destroy]
   def home
   end  

 def index
   @posts = Post.all.paginate(:page => params[:page], :per_page => 15)
   @posts = @posts.where(bedrooms: params["bedrooms"])if
   params["bedrooms"].present?
   @posts = @posts.where(bathrooms: params["bathrooms"])if
   params["bathrooms"].present?
   @posts = @posts.where(neighborhood: params["neighborhood"])if
   params["neighborhood"].present?
 end

3 个答案:

答案 0 :(得分:0)

posts = Post.find(:conditions => ["lower(bedroom) = ?", params[:bedrooms].downcase])

您可以使用lowerdowncase来实现这一目标。

答案 1 :(得分:0)

您可以在数据库查询中使用 ilike

Post.where("bedrooms ilike \"#{params[:bedrooms]}\" and bathrooms ilike \"#{params[:bathrooms]}\" and neighborhood ilike \"#{params[:neighborhood]}\"")

答案 2 :(得分:0)

注意:此文章基于此处提出的问题答案。

如果您只是提供所提供的答案,以下是使用lower功能的更好解释:

首先,请注意:您可能遇到不兼容问题 - 或者更糟糕的是:如果您使用不同的数据库开发和不同的部署数据库,则在完成损坏之前不会意识到这一点。这是一个坏主意™。使用相同的RDBMS进行开发和生产,为您节省无意义的麻烦。

lower()函数在SQlite和PostgreSQL中均可正常运行,并且响应速度更快。

  • 在标准SQLite lower(X)中只折叠ASCII字母。更多信息,请引用Core Functions in the SQLite manual一章:

      

    lower(X)函数返回带有all的字符串X的副本   ASCII字符转换为小写。默认内置lower()   函数仅适用于ASCII字符。要进行大小写转换   非ASCII字符,加载ICU扩展名

    关于PostgreSQL的更好的重点是:

  • PostgreSQL lower(X)可与开箱即用的UTF-8配合使用。

作为一个受欢迎的副作用,您可以使用index on the expression lower(style) 加快使用pg_trgm extension ILIKE在PostgreSQL中查询 比使用更快 styleLIKE的基本索引。

此外,自PostgreSQL 9.1起,您可以使用Similar UTF-8 strings for autocomplete field的GIN或GIST索引来加速任何 ILIKEnewBlock.append("path") .attr("d", arc()) .attr("id", function (d, i) { return "arc-" + i }) .attr("stroke", "gray") .attr("fill", function (d, i) { return d3.interpolateCool(Math.random()) }); 查询 - 三元组是大小写不敏感的。相关答案中的详细说明和链接:

这篇文章改编自Stackoverflow中的答案,基本上是由 Erwin Brandstetter