Mysql 重写SQL查询以在heroku上工作
如何重写rails查询以在Heroku(Portegres)上运行Mysql 重写SQL查询以在heroku上工作,mysql,ruby-on-rails,postgresql,heroku,Mysql,Ruby On Rails,Postgresql,Heroku,如何重写rails查询以在Heroku(Portegres)上运行 我也遇到了这个问题。Postgres对LIKE操作符是区分大小写的,所以下面是我在一个项目中所做的。另外,我不喜欢在本地运行postgres,所以我让它在开发中使用like(mysql/sqlite),在生产中使用ILIKE(postgres)。ILIKE是“不区分大小写的like” /config/environment.rb DATABASE_OPERATOR = { :like_operator => "
我也遇到了这个问题。Postgres对LIKE操作符是区分大小写的,所以下面是我在一个项目中所做的。另外,我不喜欢在本地运行postgres,所以我让它在开发中使用like(mysql/sqlite),在生产中使用ILIKE(postgres)。ILIKE是“不区分大小写的like” /config/environment.rb
DATABASE_OPERATOR = {
:like_operator => "LIKE"
}
/config/environments/production.rb
DATABASE_OPERATOR = {
:like_operator => 'ILIKE' #postgres awfulness
}
质疑
使用管道| |代替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同时接受这两种引号,根据配置,其他数据库只接受标准引号。使用以下命令
Student.find(:all,
:conditions =>["(concat(first_name, ' ', last_name) LIKE :text) OR
(concat(first_name, ' ', middle_names, ' ', last_name) LIKE :text)",
{:text=>"%#{params[:search]}%"]
)
使用
concat()
没有任何意义@Frank的答案很接近,但逻辑是错误的
where(first_name | last_name LIKE?)
计算结果为
“其中,姓
计算结果为真
或其中,姓
包含搜索词”
这会让你得到预期的结果
Student.all(
:conditions => ["
first_name like :search ||
last_name like :search ||
middle_names like :search
",
{:search => "%#{params[:search]}%"}
]
)
这将匹配
学生
表中在其姓名的任何部分都有参数[:search]
的所有行。(名字| |姓氏类似?)
将只返回%search%
中存在姓氏的行。根据一些论坛帖子,mySQL中| |的行为是非标准的,而pg中是concat。这是怎么回事"? 只是不一样。嘿,我可以有一个意见。就是这样:如果大多数其他数据库都对“like”进行不区分大小写的搜索,那么就这样做吧。如果你真的想区分大小写,让我用一个特殊的命令来搜索它。虽然这对我的问题没有帮助,但知道这一点很好。我会用伊利克谢谢你-救了我的命!但是,如果查询字符串包含,例如他们的名字和姓氏,该怎么办。在这种情况下,我的mySQL代码会找到它们,但是你的代码会失败。你到底遇到了什么问题?
Student.find(:all,
:conditions =>["(concat(first_name, ' ', last_name) LIKE :text) OR
(concat(first_name, ' ', middle_names, ' ', last_name) LIKE :text)",
{:text=>"%#{params[:search]}%"]
)
Student.all(
:conditions => ["
first_name like :search ||
last_name like :search ||
middle_names like :search
",
{:search => "%#{params[:search]}%"}
]
)