0

我严重无法解决这个语法错误:

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
4

3 回答 3

2

利用:

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

该错误是因为您连接了 where 条件并错过了日期的报价。

于 2012-08-28T07:18:03.563 回答
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
于 2012-08-28T07:36:52.143 回答
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意思。

于 2012-08-28T07:41:10.427 回答