2013-06-18 91 views
0

可能会感到悲伤,但它来了。导轨执行IN操作

我想对我的Rails中的一个子句执行IN操作。

呼叫是:

@ret = BBOrder.find(:all, :conditions => ["symbol LIKE ? AND creationDateTimeInt IN ?", "%#{symbol}%", "#{date_ints}"]) 

date_ints创建之前为阵列,然后对他们有join.(', ')。我想只是输入一个值,进行试运行

的错误信息是:

BBOrder Load (2.2ms) EXEC sp_executesql N'SELECT [dbo].[BBOrders].* FROM [dbo].[BBOrders] WHERE (symbol LIKE N''%%'' AND creationDateTimeInt IN N''(20130616)'')' 
ODBC::Error: 37000 (102) [unixODBC][FreeTDS][SQL Server]Incorrect syntax near '(20130616)'.: EXEC sp_executesql N'SELECT [dbo].[BBOrders].* FROM [dbo].[BBOrders] WHERE (symbol LIKE N''%%'' AND creationDateTimeInt IN N''(20130616)'')' 
Completed 500 Internal Server Error in 26ms 

ActiveRecord::StatementInvalid (ODBC::Error: 37000 (102) [unixODBC][FreeTDS][SQL Server]Incorrect syntax near '(20130616)'.: EXEC sp_executesql N'SELECT [dbo].[BBOrders].* FROM [dbo].[BBOrders] WHERE (symbol LIKE N''%%'' AND creationDateTimeInt IN N''(20130616)'')'): 
    app/controllers/pages_controller.rb:43:in `home' 

任何想法?

而且我不想做原始SQL查询。这只会大量代码。

回答

1

试试这个:

@ret = BBOrder.find(:all, :conditions => ["symbol LIKE ? AND creationDateTimeInt IN(?)", "%#{symbol}%", date_ints]) 

你并不需要为IN值做字符串解析,我认为你需要括号。

+0

ODBC :: Error:22005(245)[unixODBC] [FreeTDS] [SQL Server]转换nvarchar值'20130618,20130617,20130616, 20130614,20130614,20130613,20130612,20130611,20130610'为数据类型int .: EXEC sp_executesql N'SELECT [dbo]。[BBOrders]。* FROM [dbo]。[BBOrders] WHERE(symbol LIKE N''%%' 'AND creationDateTimeInt IN(N''20130618,20130617,20130616,20130615,20130614,20130613,20130612,20130611,20130610' '))' – Alexey

+0

它可以在一个单一的价值,而不是阵列 – Alexey

+0

此方法处理为上。另外 - 不要在阵列上使用.join。保持原样并传入数组本身。 Rails将处理它。 – Alexey

1

如果你是on Rails的3你可以使用AR查询界面是这样的:

BBOrder.where('symbol LIKE ?', "%#{symbol}%").where(creationDateTimeInt: date_ints) 

这里更多Active Record Query Interface

+0

这产生了相同的结果 – Alexey

+0

这可能是因为LIKE语句 – basgys