Выполнение задач в фоновом режиме, которые занимают некоторое время на стороне сервера, может быть выполнено с помощью отложенного задания (https://github.com/tobi/delayed_job).
Что касается только выполнения определенной проверки. Может быть что-то вроде следующего
class Data < ActiveRecord::Base
before_validation :check_numbers
def check_numbers
check_one if to_check.includes? 1
check_two if to_check.includes? 2
check_three if to_check.includes? 3
check_four if to_check.includes? 4
...etc.
end
def to_check=(arr_or_checks)
@to_check = arr_or_checks
end
def to_check
@to_check
end
Затем в вашем контроллере вы можете указать, что нужно проверять, например, вызвав to_check([1, 3, 9])
.
Это добавит больше обработки к вашему коду и также заставит контроллер знать логику, что, вероятно, не следует.Чтобы обойти эту утечку информации, вы должны сделать методы to_check частными и установить их в методах, которые используются контроллерами, например, obj.do_x
и obj.do_y
могут устанавливать разные числа в массиве to_check
.
===== ОБНОВЛЕНИЕ ======
Пример
test = Data.find(33)
test.to_check = [1,4]
test.update_attributes(params[:test])
или test = Data.find (33) test.to_check = [1,4] test.name ="новое имя" test.save
Как я уже сказал, я не большой поклонник явного выполнения этого в контроллере. Поэтому я постараюсь инкапсулировать это в самой модели следующим образом.
class Data
...
def update_attributes_by_admin(attributes)
to_check = [1,4]
update_attributes(attributes)
end
def update_attributes_by_reg_user(attributes)
to_check = [1,2,3,4,...] # use all numbers here.
update_attributes(attributes)
end
Затем вернемся вНо мы могли бы сделать что-то вроде этого
def admin_action
...
test = Data.find(33)
test.update_attributes_by_admin(params[:test])
...
end
def reg_user_action
...
test = Data.find(33)
test.update_attributes_by_reg_user(params[:test])
...
end
Конечно, было бы безопаснее на самом деле сделать обратное тому, что я сделал в этом примере.т. е.
check_one unless not_to_check.includes? 1
, а затем методы not_to_check
вместо to_check
и т. д.
Таким образом, все методы сохранения / обновления по умолчанию будут выполнять проверки, а вы создаете те, которые выполняютне делать полную проверку.