Just noticed I messed up earlier because was copying/pasting and didn't see 
that 31,32310512 were comma-separated values. I was looking at it as a 
decimal- I need to get my eyes checked (or my European decimal notation 
interpreter turned off).

How about:

a = [[1,2],[3,4]]
Phone.where("(ddd, number) in (#{(['(?, ?)']*a.size).join(', ')})", *a)

That should work. Sorry, I should have gone back and looked more carefully. 
But probably best to take this discussion off of the Rails core list.


On Thursday, May 23, 2013 12:30:15 AM UTC-4, Gary Weaver wrote:
>
> I don't think it makes sense to add to change how the existing where in 
> ActiveRecord::QueryMethods works for this case.
>
> Either you can construct one or more queries in SQL or you can't. If you 
> can, you can pass in parameters like I mentioned, which seem to answer your 
> original question, so I'm really confused at why you don't want to solve it 
> that way.
>
> Since it is unclear how what you are suggesting would be backwards 
> compatible and generally useful for all DBs that Rails supports internally, 
> I think you should take this question to StackOverflow or Ruby on Rails: 
> Talk group/list to get advice.
>
> And, I'd hope you wouldn't have to keep adding queries like that. That 
> doesn't look very efficient.
>
> On Wednesday, May 22, 2013 6:19:52 PM UTC-4, Rafael Almeida wrote:
>>
>> That does not work. It's really hard to do that query if you don't use 
>> tuples, you'd need to do one query for each possible value. Something like
>>
>> phones = []
>> [[31,32310512],[31,96438112]].each do |phone|
>>   phones += Phone..where(ddd:phone[0], number:phone[1])
>> end
>>
>> Either that or several joins. Being able to use certain features of your 
>> DBMS can speed up code writting, make it more elegant and maintainable. At 
>> the cost of being harder to switch between DBMS. But that's already hard 
>> (since it's almost impossible to use activerecord without using a few SQL 
>> statements here and there) and really has little practical use.
>>
>> I've been thinking... If Phone.where('(ddd, number) in (?)', 
>>  [[31,32310512],[31,96438112]]) generated the correct thing it would work 
>> both in mysql and postgres, but it would not work on sqlite. However, it 
>> doesn't work in sqlite anyways. So, what's the downside of having that 
>> generating the correct thing?
>>
>> On Wednesday, May 22, 2013 4:47:45 PM UTC-3, Gary Weaver wrote:
>>>
>>> I was going to joke that you may as well add support for SPARQL, since 
>>> for some reason it comes to mind when I think of tuples, and then found 
>>> something that already supports SPARQL with ActiveModel: 
>>> https://github.com/Swirrl/tripod
>>>
>>> Does this work?
>>>
>>> Phone.where('(ddd, number) in ((?),(?))',  31,32310512, 31,96438112)
>>> That looks cleaner to me. If you need to send in an array:
>>>
>>> Phone.where('(ddd, number) in ((?),(?))',  *[31,32310512, 31,96438112])
>>>
>>> or your example:
>>>
>>> Phone.where('(ddd, number) in ((?),(?))',  * 
>>> [[31,32310512],[31,96438112]].flatten)
>>> and you could always construct the "(?),(?)" by counting the flattened 
>>> array to see how many ?'s you need.
>>>
>>>
>>> On Tuesday, May 21, 2013 12:12:56 PM UTC-4, Rafael Almeida wrote:
>>>>
>>>> I would very much be able to do this query with ActiveRecord:
>>>>
>>>>     SELECT `phones`.* FROM `phones` WHERE (ddd, number) in 
>>>> ((31,32310512),(31,96438112))
>>>>
>>>> Unfortunately, ActiveRecord gives me no way to do so with a prepared 
>>>> statement. The intuitive way to do it would be:
>>>>
>>>>     Phone.where('(ddd, number) in (?)',  [[31,32310512],[31,96438112]])
>>>>
>>>> that does not work, as it yields:
>>>>
>>>> SELECT `phones`.* FROM `phones`  WHERE ((ddd, number) in ('---\n- 31\n- 
>>>> 32310512\n','---\n- 31\n- 96438112\n'))
>>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to