Использование обратных вызовов за исключением определенных случаев - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть обратный вызов Rails для количественной модели, которая обновляет некоторые числа, основанные на недавних действиях, что-то вроде:

class Data < ActiveRecord::Base
before_validation :check_numbers

def check_numbers
  Check #1...
  Check #2...
  Check #3...
  Check #4...
  ...etc.
end

Все эти проверки составляют довольно много времени, часто значительную долю секунды.

Если у меня есть действие контроллера, которое имеет какое-либо влияние на проверку № 4 - как я могу избежать проверки # 1-3? Могу ли я, например, передать переменную типа [4], которая указывает этому обратному вызову использовать ярлык?

Бонусные баллы: есть ли способ удобно выполнить часть этой обработки на стороне сервера после показа кандидата на следующей отображаемой странице?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Я думаю, что в коде чего-то не хватает

def to_check=(arr_or_checks)
   @to_check = arr_or_checks
end

Тогда, когда вы захотите его использовать, это будет что-то вроде:

mod = Data.find(1)
mod.to_check = [1,4]
mod.save

Это сохранит и проверит только 1 и 4.

0 голосов
/ 26 апреля 2011

Выполнение задач в фоновом режиме, которые занимают некоторое время на стороне сервера, может быть выполнено с помощью отложенного задания (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 и т. д.

Таким образом, все методы сохранения / обновления по умолчанию будут выполнять проверки, а вы создаете те, которые выполняютне делать полную проверку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...