2014-01-08 22 views
1

我想使用示例查詢字符串從我的Rails應用程序查詢我的PSQL數據庫:的Rails或SQL條款與上位的Active Record複雜的查詢和

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

有2個方面來此查詢:

  • 第一是比較針對在數據庫中(upperregexp_replace),我可以一個有效記錄的其中方法
  • 第二是提供內做一個操縱值似乎需要使用ARel的條件

我希望在加入這些方面有所幫助。

回答

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運算符是|

+0

我已經走了吱吱聲選項。我沒有提及,輸入參數可能是零,我認爲這會導致範圍方法的問題。我因此得到了:Place.where {[(upper(regexp_replace(postcode,'',''))== my {input_postcode} if my {input_postcode}),(name == my {input_name} if my my {input_name})] compact.inject(&:|)} – Richbits