Как избежать странного поведения в комбинации Rails + jQuery с использованием select_tag

Мемонирование эффективно относится к запоминанию («воспоминания» → «меморандум» → для запоминания) результаты вызовов методов на основе входных данных метода, а затем возврат запоминаемого результата, а не повторение вычисления результата. Вы можете думать об этом как кэш для результатов метода. Более подробную информацию см. На стр. 387 для определения в . Введение в алгоритмы (3e), Cormen и др.

. Простой пример вычисления факториалов с использованием memoization в Python был бы чем-то вроде это:

factorial_memo = {}
def factorial(k):
    if k < 2: return 1
    if k not in factorial_memo:
        factorial_memo[k] = k * factorial(k-1)
    return factorial_memo[k]

Вы можете усложниться и инкапсулировать процесс memoization в класс:

class Memoize:
    def __init__(self, f):
        self.f = f
        self.memo = {}
    def __call__(self, *args):
        if not args in self.memo:
            self.memo[args] = self.f(*args)
        #Warning: You may wish to do a deepcopy here if returning objects
        return self.memo[args]

Затем:

def factorial(k):
    if k < 2: return 1
    return k * factorial(k - 1)

factorial = Memoize(factorial)

Функция известный как « decorators », был добавлен в Python 2.4, который позволяет вам просто написать следующее, чтобы выполнить одно и то же:

@Memoize
def factorial(k):
    if k < 2: return 1
    return k * factorial(k - 1)

Библиотека декораторов питона имеет аналогичный декоратор, называемый memoized , который немного более устойчив, чем класс Memoize, показанный здесь.

0
задан mayorsanmayor 17 January 2019 в 17:02
поделиться

1 ответ

Вам нужно как-то определить выпадающий список для обновления. $('.certificate-list') возвращает все выпадающие списки сертификатов на странице. Вы можете использовать id обязательной подписи для этой цели.

- @mandatory_signatures.each do |mandatory_signature|
    .form-group.row.mt-4
      .col-sm-5
        %label Choose #{mandatory_signature.signature_title}
        .centered-vertical
          = select_tag '', options_from_collection_for_select(find_users_with_certificate_for(mandatory_signature), :id, :full_name), { include_blank: "Select User", class: 'form-control select2 find-user-certificate', style: 'width: 100%;', data: { mandatory: mandatory_signature.id } }

      .col-sm-5
        %label Choose Certificate
        .centered-vertical
          = select_tag nil, "", { include_blank: "Select Certificate", class: "form-control select2 certificate-list js-#{ mandatory_signature.id }", style: 'width: 100%;' }

$('.find-user-certificate').change(function() {
    let user_id = $(this).val();
    let mandatory_id = $(this).data('mandatory')

    getUserCertificates(user_id, mandatory_id);
});

function getUserCertificates(userId, mandatoryId) {
  let hostname = window.location.origin;

  $.ajax({
    url: hostname + '/users/' + userId + '/certificates',
    dataType: 'json',
    method: 'get',
    success: function(data) {
      options = '';
      data.forEach(function(object) {
        options += `<option value=${object.id}>${object.name}</option>`;
      });
      $('.certificate-list.js-' + mandatoryId).empty();
      $('.certificate-list.js-' + mandatoryId).append(options);
    }
  });
}
0
ответ дан Vasilisa 17 January 2019 в 17:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: