Это - боль, которую мы чувствуем также. Как только Вы выручаете клиента, для клиента слишком легко непосредственно связаться с разработчиком позже и поддержкой запроса. И так как мы обычно стремимся нравиться, и вероятно чувствовать вид ответственных, когда приложение, которое мы создали для них, будет иметь проблему, мы слишком часто даем клиенту быструю руку помощи.
я думаю, что разработчики должны быть разделены от клиентов, но это требует, чтобы компания имела support/concultancy отдел, который может решить проблему вместо этого. Они в свою очередь должны быть свободны связаться с разработчиком, если это не огромная компания с основным приложением, где существует меньше риска, что проблема может быть прослежена до проблемы с исходным кодом.
, Но позволяют мне сказать Вам, я понимаю, насколько трудный это. Я работал в нашем магазине консультирования много лет, начиная с поддержки, и теперь я являюсь главным образом руководящим другие консультанты и разработка. Существует много клиентов (как сотни), кто чувствует, что они имеют личные отношения со мной и предполагают, что могут позвонить мне непосредственно даже после лет и лет.
Моя подсказка должна удостовериться, что у Вас есть хорошая сеть консультантов и supportworkers, кто может помочь клиенту для Вас, и сделать, чтобы они связались с Вами вместо этого, если они не могут понять его.
Один из подходов - использовать SIGEV_SIGNAL
с сигналом в реальном времени для «переноса» "готовый файловый дескриптор для обработчика сигнала. Очередь сигналов в реальном времени и обработчики сигналов выполняются асинхронно в одном потоке, поэтому этот подход более или менее функционально эквивалентен SIGEV_CALLBACK
:
/*
* Warning! Untested!
* Also, safe initialization, per-thread signal masking and
* error-checking omitted.
*/
static void my_callback(int sig, siginfo_t *info, void *context) {
int fd;
fd = info->si_value.sival_int;
/* ...enqueue the fd for processing... */
}
struct sigaction sa;
sa.sa_handler = my_callback; /* Register our async callback */
sa.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN+1, &sa, NULL);
...
struct aiocb ac;
ac.aio_filedes = some_fd;
ac.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ac.aio_sigevent.sigev_signo = SIGRTMIN+1; /* Associate callback w. aiocb */
....
aio_read(&ac);
Теперь ваш my_callback будет запускаться асинхронно в одном потоке. , и вы должны передать fd своему вспомогательному пулу потоков. См. Также этот бит кода SGI , демонстрирующий, как вернуться к SIGEV_SIGNAL
, когда SIGEV_CALLBACK
недоступен.
SIGEV_CALLBACK
:
/*
* Warning! Untested!
* Also, safe initialization, per-thread signal masking and
* error-checking omitted.
*/
static void my_callback(int sig, siginfo_t *info, void *context) {
int fd;
fd = info->si_value.sival_int;
/* ...enqueue the fd for processing... */
}
struct sigaction sa;
sa.sa_handler = my_callback; /* Register our async callback */
sa.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN+1, &sa, NULL);
...
struct aiocb ac;
ac.aio_filedes = some_fd;
ac.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ac.aio_sigevent.sigev_signo = SIGRTMIN+1; /* Associate callback w. aiocb */
....
aio_read(&ac);
Теперь ваш my_callback будет запускаться асинхронно в одном потоке. , и вы должны передать fd в пул потоков-помощников. См. Также этот бит кода SGI , демонстрирующий, как вернуться к SIGEV_SIGNAL
, когда SIGEV_CALLBACK
недоступен.
SIGEV_CALLBACK
:
/*
* Warning! Untested!
* Also, safe initialization, per-thread signal masking and
* error-checking omitted.
*/
static void my_callback(int sig, siginfo_t *info, void *context) {
int fd;
fd = info->si_value.sival_int;
/* ...enqueue the fd for processing... */
}
struct sigaction sa;
sa.sa_handler = my_callback; /* Register our async callback */
sa.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN+1, &sa, NULL);
...
struct aiocb ac;
ac.aio_filedes = some_fd;
ac.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ac.aio_sigevent.sigev_signo = SIGRTMIN+1; /* Associate callback w. aiocb */
....
aio_read(&ac);
Теперь ваш my_callback будет запускаться асинхронно в одном потоке. , и вы должны передать fd в пул потоков-помощников. См. Также этот бит кода SGI , демонстрирующий, как вернуться к SIGEV_SIGNAL
, когда SIGEV_CALLBACK
недоступен.
Существует известная проблема с Rails 3.1.1, которая нарушает эту функциональность. Если у вас возникла эта проблема, попробуйте сначала выполнить обновление, она исправлена в версии 3.1.2
Вы так близко. Проблема в том, что вы неправильно используете параметр: source. : source должен указывать на полиморфное отношение own_to. Затем все, что вам нужно сделать, это указать: source_type для отношения, которое вы пытаетесь определить.
Это исправление модели Widget должно позволить вам делать именно то, что вы ищете.