#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. Спасибо, я забыл об этом!