0

二重引用符で囲まれた 3 つの補間値を含む複雑な結合条件があります (SQL インジェクション攻撃を回避するための AR の引用の一部として)。

:sanitize_sqlまたはプレースホルダー:sanitize_sql_arrayを使用できるという他の質問を用意しましたが、残念ながら?、それらは で定義されていないようですactiverecord-sqlserver-adapter

それで、私の質問は、ActiveRecord を介して SQL サーバーでこれを機能させるにはどうすればよいですか??


def self.with_active_deal_counts
  joins(<<-SQL.squish
    LEFT OUTER JOIN (
      SELECT [b].[merchant_id], COUNT(*) deal_count
      FROM   [tbl_deal] b
      WHERE deal_active = 1
        AND deal_archive = 2
        AND ( deal_end = '1900-01-01'
              OR deal_end > '#{Time.now + Time.now.utc_offset - 1.day}')
        AND deal_start <= '#{Time.now + Time.now.utc_offset}'
      GROUP BY [b].[merchant_id]
    ) a ON a.[merchant_id] = [tbl_merchant].[merchant_id]
    SQL
  ).select("tbl_merchant.*, a.deal_count")
end

これにより、

EXEC sp_executesql N'SELECT tbl_merchant.*, a.deal_count FROM [tbl_merchant] LEFT OUTER JOIN (
 SELECT [b].[merchant_id], COUNT(*) deal_count
 FROM [tbl_deal] b
 WHERE deal_active = 1
 AND deal_archive = 2
 AND ( deal_end = ''1900-01-01''
 OR deal_end > ''2013-09-30 07:07:20 -0700'')
 AND deal_start <= ''2013-10-01 07:07:20 -0700''
 GROUP BY [b].[merchant_id]
) a ON a.[merchant_id] = [tbl_merchant].[merchant_id]'

...二重引用符で囲まれた値のために機能しません。''2013-09-30 07:07:20 -0700''

具体的には、Incorrect syntax near '1900'(SQL Management Studio でクエリを実行すると、.

4

1 に答える 1

0

あなたの質問は、私がよくわからないプレースホルダーに関するものであることを知っています。私はかつて同様の状況に遭遇し、ルビーの「補間された文字列」を使用することになりました。これは一見の価値があるかもしれません。

( http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals%Q )または複数行の SQL の場合、heredoc が便利です。SQLに使用する方法は次のとおりです。%Q

sql = %Q[ some crazy SQL with '#{Time.now}' ]

使用例は次のようになります。

sql = %Q[ select '#{Time.now}' ]
# This translates to
N' select ''2013-10-01 16:25:46 -0400'' '
=> #<ActiveRecord::Result:0x000000052acc40 @columns=[""], @rows=[["2013-10-01 16:25:46 -0400"]], @hash_rows=nil>
于 2013-10-01T20:29:23.987 に答える