Программно применить область ActiveRecord, которая принимает аргументы

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

Я создаю систему, в которой необходимо программно применить одно или несколько предложений where к объекту отношения ActiveRecord. Это отлично работает в следующей ситуации:

Предположим, что модель Employee имеет область с именем «male»

затем:

 filter_name = "male"
Employee.send(filter_name)  # works
  

Однако с областями, которые принимают аргументы,

 "NoMethodError (undefined method `age_range(45, 55)'
  

например, с помощью этой области:

 scope :age_range, ->(low, high) {where("age >= #{low} AND age <= #{high}")}
  

Область отлично работает в консоли, например

 Employee.age_range(45,55)
  

Спасибо за любой совет.

Комментарии:

1. Я предлагаю также изменить область на where("age >= ? AND age <= ?", low, high) , чтобы предотвратить атаки SQL-инъекций

Ответ №1:

Object# send принимает имя метода и его аргументы:

 name = :age_range
low  = 45
high = 55
Employee.send(name, low, high)
  

Я бы рекомендовал использовать Object # public_send , чтобы убедиться, что вы используете только общедоступный API:

 Employee.public_send(name, low, high)
  

Комментарии:

1. Спасибо, я забыл об этом!