我在本地运行MySQL数据库进行开发,但部署到使用Postgres的Heroku.Heroku几乎可以处理所有事情,但是我的不区分大小写的Like语句变得区分大小写.我可以使用iLike语句,但我的本地MySQL数据库无法处理.
编写与MySQL和Postgres兼容的不区分大小写的查询的最佳方法是什么?或者我是否需要根据我的应用正在与之交谈的数据库编写单独的Like和iLike语句?
我需要在rails中的列上创建一个不区分大小写的索引.我是通过SQL做到的:
execute(
"CREATE UNIQUE INDEX index_users_on_lower_email_index
ON users (lower(email))"
)
Run Code Online (Sandbox Code Playgroud)
这很好用,但在我的schema.rb文件中我有:
add_index "users", [nil],
:name => "index_users_on_lower_email_index",
:unique => true
Run Code Online (Sandbox Code Playgroud)
注意"无".因此,当我尝试克隆数据库以运行测试时,我得到一个明显的错误.我在这里做错了吗?我应该在rails中使用其他一些约定吗?
谢谢您的帮助.
虽然我在数据库中总体上喜欢区分大小写,但有几次我觉得很痛苦.user_name和email是我不想担心的字段的好例子 - 特别是在搜索时.
在使用以下内容保存之前,可以轻松地将字符串置为字符串:
before_save做self.email.downcase!结束
这样,user_name和电子邮件始终以小写形式保存.但是find_by_user_name和find_by_email的最佳方法是什么?我当然可以记得总是将我传递给那些方法的字符串 - 但这看起来不是很干.
我曾经考虑过覆盖find_by_email,并且在我降低电子邮件的情况下用super调用原始版本,但我没有任何运气可以搞清楚.
那么,最好的方法是什么?
PS我不认为像这样的相关帖子(如何为Rails 3编写不区分大小写的find_by_email)正试图解决同样的问题.这里带有"lower"的自定义sql对我来说是无用的,因为我已经确保所有这些值都更低 - 它是现在进入的(可能来自用户输入它的表单),我需要下载.
我希望能够Artist.case_insensitive_find_or_create_by_name(artist_name)[1](并且它可以在sqlite和postgreSQL上工作)
实现这一目标的最佳方法是什么?现在我只是直接向Artist类中添加一个方法(有点难看,特别是如果我想在另一个类中使用此功能,但无论如何):
def self.case_insensitive_find_or_create_by_name(name)
first(:conditions => ['UPPER(name) = UPPER(?)', name]) || create(:name => name)
end
Run Code Online (Sandbox Code Playgroud)
[1]:理想情况下,这可能是Artist.find_or_create_by_name(artist_name, :case_sensitive => false),但这似乎更难实施
我写的搜索功能正在运行,但我希望它不区分大小写.
我怎么能让它变得麻木不仁,虽然我不想改变条件因为它运行得很好.所有四个参数都是可选的,如果它们中的任何一个基于这种条件而存在.
conditions = {}
conditions['first_name'] = params[:first_name] unless params[:first_name].blank?
conditions['last_name'] = params[:last_name] unless params[:last_name].blank?
conditions['specialities.name'] = params[:speciality] unless params[:speciality].blank?
conditions['locations.zipcode'] = params[:zipcode] unless params[:zipcode].blank?
search = Model.using_scope.where(conditions)
Run Code Online (Sandbox Code Playgroud)
我使用PostgreSQL作为区分大小写的数据库.
我发现搜索我特别不想要字符大小的事情的最好方法是:
@tag = Rails.env.development? ? Category.where("LOWER(name) LIKE ?", "%#{params[:find]}%")[0] : Category.where("LOWER(name) ILIKE ?", "%#{params[:find]}%")[0]
Run Code Online (Sandbox Code Playgroud)
我必须拥有.env查找器,因为我使用Heroku,而且我不关心在我的开发机器上安装PostgreSQL.不过,是不是有类似的东西:
@tag = Category.find_by_name(params[:find], case_sensitive: false)
Run Code Online (Sandbox Code Playgroud)
我们可以将选项传递给find_byRails中的帮助程序吗?这将是一个很好的.
在Rails 3.2应用程序中,我有一个搜索字段,它在用户模型中使用以下例程.
def self.search(search)
if search
where('fullname LIKE ? OR email LIKE ?', "%#{search}%", "%#{search}%")
else
scoped
end
end
Run Code Online (Sandbox Code Playgroud)
这似乎是执行区分大小写的搜索.如何修改它以使其不区分大小写?
非常感谢
activerecord ×4
ruby ×3
postgresql ×2
database ×1
find ×1
heroku ×1
lowercase ×1
mysql ×1
search ×1