Rails:查询语法错误

时间:2012-08-28 07:14:53

标签: ruby-on-rails ruby-on-rails-3

我真的无法解决这个语法错误:

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

3 个答案:

答案 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的含义。