Rails Active在sql子句中使用UPPER和OR记录复杂查询

时间:2014-01-08 10:20:54

标签: sql ruby-on-rails arel

我想使用示例查询字符串从我的rails应用程序查询我的psql数据库:

select * from venues where upper(regexp_replace(postcode, ' ',  '')) = '#{postcode}' or name = '#{name}'

此查询有两个方面:

  • 第一个是与数据库中的操纵值(upperregexp_replace)进行比较,我可以在活动记录中进行比较
  • 第二个是提供似乎需要使用ARel的or条件

我很感激帮助将这些加在一起。

1 个答案:

答案 0 :(得分:1)

查看squeel,它可以以非常友好的方式处理OR查询和函数:https://github.com/activerecord-hackery/squeel& http://railscasts.com/episodes/354-squeel

例如:

[6] pry(main)> Page.where{(upper(regexp_replace(postcode, ' ', '')) == 'foo') | (name == 'bar')}.to_sql
=> "SELECT \"pages\".* FROM \"pages\"  WHERE upper(regexp_replace(\"pages\".\"postcode\", ' ', '')) = 'foo'"

替代方法是直接对查询进行编码:

scope :funny_postcode_raw, lambda{ |postcode, name| where("upper(regexp_replace(postcode, ' ',  '')) = ? or name = ?", postcode, name) }

我不建议去Arel路径,99.9%的时间不值得

注意:squeel的OR运算符是|