我真的无法解决这个语法错误:
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 :(得分:2)
使用:
Post.where('post_id = ? AND created_at > ?', params[:id], 24.hours.ago.utc.to_s(:db))
错误是因为你连接了where条件并错过了日期的引用。
答案 1 :(得分: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 :(得分:0)
是否有特定原因需要使用Post.where(some_function)
,因为提供类似Post.filter(params[:post_filter], params[:id])
的方法会更有意义 - 如果您需要重复使用过滤器方法,只需编写一个模块和将其包含在所有相关模型中。
此外,您当前的代码对SQL注入攻击持开放态度。切勿使用ruby字符串插值来创建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
的含义。