2012-08-28 25 views
0

我認真解決不了這個語法錯誤:的Rails:在哪裏查詢語法錯誤

PG::Error: ERROR: syntax error at or near "07" 
LINE 1: ...WHERE (post_id = 13 AND created_at > 2012-08-27 07:13:26) ... 

這是我的查詢看起來是這樣的:

Post.where(post_filter_params_where) 

    def post_filter_params_where 
     case params[:post_filter].to_i 
     when 1 
     "post_id = #{params[:id]}" 
     when 2 
     "post_id = #{params[:id]}" 
     when 3 
     time = 24.hours.ago.utc.to_s(:db) 
     "post_id = #{params[:id]} AND created_at > #{time}" 
     else 
     "post_id = #{params[:id]}" 
     end 
    end 
+0

張貼代碼plz。 – xdazz

+0

剛剛發佈,對此感到抱歉 – flyingarmadillo

+0

如果您發佈了ruby代碼,因爲這是SQL語法錯誤,所以本來會很好。 – Strelok

回答

0

,我需要puts

def post_filter_params_where 
     case params[:post_filter].to_i 
     when 1 
     puts 'post_id = ?', params[:id] 
     when 2 
     puts 'post_id = ?', params[:id] 
     when 3 
     puts 'post_id = ?', params[:id], 24.hours.ago.utc.to_s(:db) 
     else 
     puts 'post_id = ?', params[:id] 
     end 
    end 
2

用途:

Post.where('post_id = ? AND created_at > ?', params[:id], 24.hours.ago.utc.to_s(:db)) 

錯誤是因爲你連接了where條件並錯過了日期的報價。

+0

這個問題是我實際上從函數Post.where(some_function)返回'where'輸入。我發佈了一個編輯。 – flyingarmadillo

0

預先考慮從功能querys有你爲什麼需要使用Post.where(some_function),因爲它會更有意義,提供一種方法,就像Post.filter(params[:post_filter], params[:id])特殊原因 - 如果你需要要重用您的過濾方法,只需編寫一個模塊並將其包含在所有相關模型中。

此外,您當前的代碼可能面臨SQL注入攻擊。切勿使用紅寶石串插創建SQL字符串,請參閱http://guides.rubyonrails.org/security.html#sql-injection

總之,這裏的一些代碼:)

class Post < ActiveRecord::Base 
    def self.filter(filter, post_id) 
    if filter.to_i == 3 
     where('post_id = ? AND created_at > ?', post_id, 24.hours.ago.utc) 
    else 
     where('post_id = ?', post_id) 
    end 
    end 
end 

然後,而不是在你的控制器使用Post.where(some_function),只需使用Post.filter(params[:post_filter], params[:id])。紅利點,更好地使用一些常數來描述什麼3的含義。