Я использовал бы self.table_name_prefix
, как это было предложено другими, но вы можете определить его немного более точно следующим образом:
self.table_name_prefix "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."
, альтернативно вы также можете использовать это:
self.table_name_prefix "#{connection.current_database}."
Вы должны иметь в виду, что последний выполнит запрос SELECT DATABASE() as db
при первом загрузке этого класса.
Как упоминалось в ответе Андрея, если вы просто вызываете qualificationCheckCallback
как обычный метод, вы получите только возвращаемое значение из одного из методов. По этой причине довольно много делегатов многоадресной передачи, у которых есть возвращаемое значение.
Если ваша цель - проверить, возвращает ли хотя бы один из методов, хранящихся в вашем делегате, false, вам нужно вызвать методы индивидуально. Вот один из способов сделать это с помощью метода Delegate.GetInvocationList () :
bool hasAtLeastOneFalse = false;
if (qualificationCheckCallback != null)
{
foreach(var f in qualificationCheckCallback.GetInvocationList()
.Cast<Func<Employee, Shift, bool>>())
{
if (!f(employee, shift))
{
hasAtLeastOneFalse = true;
// break; // If you don't care about invoking all delegates, you can choose to break here.
}
}
}
Console.WriteLine(hasAtLeastOneFalse);
Я не предполагаю, что это хорошая практика, но это можно сделать.
Быстрый поиск в MSDN нашел этот поток:
Проблема с событиями заключается в том, что возвращаемые значения нельзя полностью доверять. Вы получите только одно возвращаемое значение, независимо от того, сколько подписчиков у вас есть на мероприятие. Центральная проблема заключается в том, что вы не можете надежно определить, какой абонент произвел возвращаемое значение. Красота .NET Event Model - анонимность, которую она использует. Это означает, что подписчики событий полностью абстрагируются от издателей событий.
Вы используете неправильный шаблон. Я бы рекомендовал хранить список этих делегатов и перебирать их по списку, вместо того, чтобы использовать множественные имена для вызова нескольких целей.
Вы можете сделать эту работу (если нужно), изменив подпись, чтобы включить переменная «состояние», передаваемая по ссылке на каждого вызывающего абонента:
private Action<Employee, Shift, QualCheckState> qualificationCheckCallback;
public class QualCheckState { public bool Passed { get; set; } }
// Call it thus:
var state = new QualCheckState { Passed = true }; // Hope for the best
qualificationCheckCallback(someEmployee, someShift, state);
if (state.Passed) {
// Assume everyone passed
}
Имейте в виду, для этого требуется, чтобы вызываемые лица соблюдали подпись и не перезаписывали чье-либо несостоявшееся состояние:
public void SomeCallee(Employee e, Shift s, State state) {
// If some other check failed, don't bother doing our check.
if (!state.Passed) return;
// Do some check here
if (checkFailed) state.Passed = false;
}
Конечно, вы можете также расширить этот шаблон, чтобы сделать его более безопасным:
public class QualCheckState {
private List<bool> _results = new List<bool>();
public bool Passed { get { return _results.All(s => s); }
public void RecordResult(bool result) {
_results.Add(result);
}
}