2013-08-06 49 views
0

我正在編寫一個複雜的ActiveRecord查詢,它在過濾函數管道中傳遞一個ActivRecord :: Relation。其中一個必須添加一系列「或」鏈接條件。由於ActiveRecord :: Relation沒有提供#or方法,我正在編寫一個SQL字符串以傳入#where。 這個字符串是動態生成的,所以我不能真正使用?爲值。我從以前的問題中知道,使用預準備語句是創建查詢的最佳實踐方法,但我找不到在此處應用它的方法。在使用預處理語句的ActiveRecord中轉義字符串不可能

有沒有逃避字符串或轉換爲使用預處理語句的方法?

編輯:我做這樣的事情(該方法接收的項目作爲一個ActiveRecord :: Relation對象

where_string = ''; 
filters.each do |field,value| 
    if(Item.column_names.include? field) 
    where_string += "OR" if where_string!='' 
    where_string += " #{field} LIKE '%#{value.to_s}%'" 
    end 
return items.where(where_string) 
+2

請提供確切的查詢 – user2801

+0

@ user2801我使用查詢示例編輯了該問題。對不起如果問題之前還不清楚。 – andreimarinescu

回答

1

嘗試使用下面的

query_array = [] 
value_array = [] 
filters.each do |field,value| 
    if(Item.column_names.include? field) 
    query_array << "#{field} LIKE ?" 
    value_array << "%#{value.to_s}%" 
    end 
end 
value_array.insert(0, query_array.join(' OR ')) 
return Item.where(value_array) 
1

這是我會怎麼做。 :

def filters_to_query(filters) 
    filters.inject(['']) do |query, field, value| 
    if Item.column_names.includes? field 
     query[0] << ' OR ' unless query[0].blank? 
     query[0] << "#{field} LIKE ?" 
     query << value 
    end 
    end 
end 

Item.where(filters_to_query filters)