我正在构建一个包含搜索字段的应用,如何在我的应用中使搜索过滤器不区分大小写。我可以在下面的代码块中完成此任务:
<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
答案 0 :(得分:0)
posts = Post.find(:conditions => ["lower(bedroom) = ?", params[:bedrooms].downcase])
您可以使用lower
和downcase
来实现这一目标。
答案 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中查询 比使用更快 style
和LIKE
的基本索引。
此外,自PostgreSQL 9.1起,您可以使用Similar UTF-8 strings for autocomplete field的GIN或GIST索引来加速任何 ILIKE
和newBlock.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