Я оставил комментарий к тому, что было бы моим предпочтительным подходом: это необычно, чтобы ваши параметры были такими, какие вы есть, и идеальным подходом было бы решить эту проблему.Использование eval
определенно бесполезно - есть некоторые серьезные проблемы с безопасностью (например, представьте, что кто-то отправляет "City.delete_all"
в качестве параметра).
В качестве решения вашей непосредственной проблемы вы можете сделать этоиспользуя регулярное выражение, сканируя на наличие цифр:
str = "['1','2','3','4']"
str.scan(/\d+/)
# => ["1", "2", "3"]
str = '1'
str.scan(/\d+/)
# => ["1"]
# In your case:
params[:city_id].scan(/\d+/)
В очень простых сроках это просматривает данную строку для любых цифр, которые там находятся.Вот простой Regex101 с результатами / объяснением: https://regex101.com/r/41yw9C/1.
Rails должен позаботиться о преобразовании полей в последующем запросе (where(city_id: params[:city_id])
), хотя, если вам явно нужен массив целых чисел, вы можете добавитьследующее (спасибо @SergioTulentsev):
params[:city_id].scan(/\d+/).map(&:to_i)
# or in a single loop, though slightly less readable:
[].tap { |result| str.scan(/\d+/) { |match| result << match.to_i } }
# => [1, 2, 3, 4]
Надеюсь, что это полезно, дайте мне знать, как вы ладите или если у вас есть какие-либо вопросы.