I had expected that:

BsRequestAction.where('(target_project, target_package) IN (?)', [[
'target_project1','target_package1'], ['target_project2','target_package2'
]])

produces the following SQL query:

SELECT  `bs_request_actions`.* FROM `bs_request_actions` WHERE ((
target_project, target_package) IN (('target_project1','target_package1'), (
'target_project2','target_package2')))

being equivalent to:

BsRequestAction.where("(target_project, target_package) IN 
(('target_project1','target_package1'), 
('target_project2','target_package2'))")

Instead, it produces the following error:

Traceback (most recent call last):
        1: from (irb):510
TypeError (can't quote Array)

This forces me to write code like:

projects_and_packages = [['target_project1','target_package1'], [
'target_project2','target_package2']]
query_string = projects_and_packages.map { |project, package| 
"(#{project},#{package})" }.join(",")
BsRequestAction.where("(target_project, target_package) IN 
(#{query_string})")


In addition, the `where` documentation 
<https://apidock.com/rails/ActiveRecord/QueryMethods/where> mentions the 
following:

the first element of the array is treated as a template, and the remaining 
> elements are inserted into the template to generate the condition. Active 
> Record takes care of building the query to avoid injection attacks, and 
> will *convert from the ruby type to the database type where needed*. 
> Elements are inserted into the string in the order in which they appear.
>

which makes me think that this case should be supported (meaning that this 
could also be considered a bug instead of a feature request). There is 
nothing else (at least that I have seen) regarding not supported Ruby types 
or the kind of things that are supported.


I would like to suggest that Rails supports arrays of pairs for WHERE IN 
queries as it is expected and allow to write much nicer code. I think it 
wouldn't conflict with current supported behaviors. My main concern are the 
databases which doesn't support pairs. I think for example SQLlite doesn't 
support it. But IMO in that case it would be enough with an exception or an 
small trick like:

SELECT  `bs_request_actions`.* FROM `bs_request_actions` WHERE 
 target_project || '-' || target_package IN (
'target_project1-target_package1', 'target_project2-target_package2')



This has first been discussed in a GitHub issue (or more than discussed 
redirected here): https://github.com/rails/rails/issues/35925

-- 
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 rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at https://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to