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インジェクション攻撃に対してオープンです。SQL文字列を作成するためにRuby文字列補間を使用しないでください。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 に答える