При создании службы QnA создаются следующие ресурсы
Если вы удалите все вышеперечисленные ресурсы, ваша база знаний должна быть удалена автоматически.
Скорее всего, ваша КБ была открыта в браузере перед удалением ваших ресурсов. Итак, когда вы нажимаете «Удалить» сейчас, после удаления ресурсов, QnA Maker не может найти фоновые сервисы.
Соответственно, если вы обновите свой браузер, вы не найдете свой KB
Обновление
Чтобы уточнить, как распознавать ресурсы, связанные с вашей базой знаний, давайте предположим, что ваш хост развертывания базы знаний - https://qnaappservice1.azurewebsites.net/qnamaker
, это означает следующее
qnaappservice1
qnaappservice1-[Random postfix]
подобно [113 ]. Остальные ресурсы будут названы в зависимости от вашей службы QnA. Например, если ваша служба QnA называется qnaservice1
, ваши оставшиеся ресурсы будут следующими:
qnaservice1
qnaservice1-ai
Я нахожу, что это очень интересный вопрос. Я собираюсь думать вслух здесь момент...
В конечном счете то, с чем мы сталкиваемся, является решением нарушить шаблон разработки приемлемая практика для достижения определенного набора функциональности. Так, мы должны спросить нас
1) Каковы возможные решения, которые не нарушили бы шаблон MVC
2) Каковы возможные решения, которые нарушили бы шаблон MVC
3) Какой вариант является наилучшим? Я считаю шаблоны разработки и общепринятую практику очень важными, но в то же время если придерживающийся их делает Ваш код более сложным, затем правильное решение может состоять в том, чтобы нарушить практику. Некоторые люди могли бы не согласиться со мной на этом.
Позволяет рассматривают № 1 сначала.
Первое, что пришло на ум я думал бы о следующих возможных решениях
A) Если Вы действительно интересуетесь тем, кто выполняет эти действия, эти данные должны храниться в модели какой-либо путь? Это сделало бы эту информацию доступной для Вашего Наблюдателя. И это также означает, что любая другая вызывающая сторона фронтенда Вашего класса ActiveRecord получает ту же функциональность.
B) Если Вы действительно не интересуетесь пониманием, кто создал запись, но более интересующийся входом самих веб-действий, то Вы могли бы рассмотреть "наблюдение" действий контроллера. Прошло некоторое время, так как я ввел по абсолютному адресу вокруг источника направляющих, таким образом, я не уверен кто их ActiveRecord:: Наблюдатель "наблюдает" модель, но Вы смогли адаптировать ее к наблюдателю контроллера. В этом смысле Вы не наблюдаете модель больше, и имеет смысл делать сессию и другую информацию о данных типа контроллера тому наблюдателю. C) Простое решение, с наименьшим количеством "структуры", состоит в том, чтобы просто отбросить Ваш код входа в конце Ваших методов действия, которые Вы наблюдаете.
Рассмотрите опцию № 2 теперь, повредив методы MVC.
A) Как Вы предполагаете, Вы могли найти средства для того, чтобы заставлять Вашу модель Observer иметь доступ к данным Сессии. Вы связали свою модель с Вашей бизнес-логикой.
B) Не может думать ни о каких других здесь :)
Мой персональный наклон, не зная больше детализирует о Вашем проекте, или 1 А, если я хочу присоединить людей к записям, или 1C, если существует только несколько мест, где я интересуюсь выполнением этого. Если Вы действительно желаете устойчивое решение для входа для всех своих контроллеров и действий, Вы могли бы рассмотреть 1B.
Наличие Вашего образцового наблюдателя находит, что данные сессии являются немного "вонючими", и вероятно повредились бы, если Вы пытались использовать свою модель в каком-либо другом проекте/ситуации/контексте.
Hrm, это - липкая ситуация. В значительной степени необходимо нарушить MVC для получения его работающий приятно.
Я сделал бы что-то вроде этого:
class MyObserverClass < ActiveRecord::Observer
cattr_accessor :current_user # GLOBAL VARIABLE. RELIES ON RAILS BEING SINGLE THREADED
# other logging code goes here
end
class ApplicationController
before_filter :set_current_user_for_observer
def set_current_user_for_observer
MyObserverClass.current_user = session[:user]
end
end
Это - немного hacky, но это больше не hacky, чем много других базовых вещей направляющих, которые я видел.
Все, что необходимо было бы сделать для создания этого ориентированным на многопотоковое исполнение (это только имеет значение, работаете ли Вы на jruby так или иначе) должно изменить cattr_accessor, чтобы быть правильным методом и иметь его хранилище, это - данные в локальной памяти потока
Вы правы относительно этого повреждающий MVC. Я предложил бы использовать обратные вызовы в Ваших контроллерах, главным образом потому что существуют ситуации (как модель, какое сохранение называют, но приводит проверку к сбою), где Вы не хотели бы наблюдателя, регистрирующего ничто.
Я нашел, что очевидный способ сделал то, что предлагается ответом, который я выбрал.
http://pjkh.com/articles/2009/02/02/creating-an-audit-log-in-rails
Это решение использует модель AuditLog, а также модуль TrackChanges для добавления функциональности отслеживания к любой модели. Это все еще требует, чтобы Вы добавили строку к контроллеру, когда Вы обновляете или создаете все же.
В прошлом при выполнении чего-то вроде этого, я склонялся к расширению класса модели User для включения идеи 'текущего пользователя'
Смотря на предыдущие ответы, я вижу предложения для хранения фактического активного рекордного пользователя на сессии. Это имеет несколько недостатков.
Так, чтобы в начале запроса (в фильтре) Вы взяли user_id от сессии и считали пользователя, установку User.current_user.
Что-то вроде этого...
class User cattr_accessor :current_user end class Application before_filter :retrieve_user def retrieve_user if session[:user_id].nil? User.current_user = nil else User.current_user = User.find(session[:user_id]) end end end
С тех пор это должно быть тривиально.