У меня есть приложение со следующими моделями: User
, Task
, и Assignment
. Каждое присвоение belongs_to
Пользователь и Задача (или другими словами, Задача присвоена Пользователю через Присвоение).
После того как Пользователь выполняет Задачу, Присвоение отмечено как завершенное, и приложение сразу создает новое Присвоение (или другими словами, присваивает задачу кому-то еще).
Сразу после создания этого нового Присвоения, я хочу послать электронное письмо новому представителю. Я знаю, что могу сделать эти из трех путей:
after_create
.То, какая из этих опций делает люди думают, является лучшим, и почему? № 1 кажется плохим мне, потому что я не хочу должным быть не забывать отправлять его в каждом действии, которое могло бы завершить Присвоение. Я услышал, что пара людей говорит, что наблюдатели направляющих плохи и должны избежаться, но я не уверен, являются ли они людьми, я должен доверять или нет. Какие-либо другие мнения?
Вот небольшой сценарий крючков, который делает то, что вы хотите: Необходимо настроить 2 вещи:
import sys
import subprocess
import re
#this is a list of illegal suffixes:
illegal_suffixes = ['.exe','.dll']
# Path to svnlook command:
cmdSVNLOOK="/usr/bin/svnlook";
def isIllegalSuffix(progname):
for suffix in illegal_suffixes:
if (ptFilename.endswith(suffix)):
return True
return False
######### main program ################
repopath = sys.argv[1]
transact = sys.argv[2]
retVal = 0
svninfo = subprocess.Popen([cmdSVNLOOK, 'changed', '-t', transact, repopath],
stdout = subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = svninfo.communicate();
prog = re.compile('(^[ACUDRM_])[ACUDRM]*\s+(.+)') # regex for svnlook output
for line in stdout.split("\n"):
if (line.strip()!=""):
match=re.search(prog, line.strip())
if match:
mode = match.group(1)
ptFilename = match.group(2)
if mode == 'A' and isIllegalSuffix(ptFilename):
retVal = 1
sys.stderr.write("Please do not add the following ")
sys.stderr.write("filetypes to repository:\n")
sys.stderr.write(str(illegal_suffixes)+"\n")
break
else:
sys.stderr.write("svnlook output parsing failed!\n")
retVal = 1
break
else:
# an empty line is fine!
retVal = 0
sys.exit(retVal)
-121--2695341- Вы можете использовать наблюдателей для одного действия, и если есть только одно сообщение электронной почты для другого действия, вы можете использовать для него параметр № 1.
Слышали ли вы о acts_as_state_machine или каких-либо других подобных решениях?
http://github.com/rubyist/aasm
Они позволяют определить состояние каждого объекта и различные вещи, которые могут произойти при изменении состояния.
Это позволяет вам иметь столько логики, сколько вам нужно о том, когда вещи отправляются, если вам это нужно. Может быть чрезмерным, но может быть очень полезным. Я предлагаю, потому что вы хотите отправить электронное письмо, когда задача «завершена», которое звучит так, как будто это может быть тип состояния или столбец состояния в вашей модели задачи.
-121--4043441-Вы правы, первый способ не является хорошим подходом. Наблюдатели - мой предпочтительный путь, по нескольким причинам.
Во-первых, если вы используете TDD (тестовую разработку), вы можете отключить наблюдателей, чтобы более чисто протестировать модель без каждого создания, запускающего создание почтовика. Затем можно отдельно выполнить единичное тестирование почтовика и наблюдателя.
Во-вторых, идея отделить отзывы создает более чистый кодекс. Обратные вызовы на самом деле не являются частью вашей модели, это события. Модель содержит функции и атрибуты, необходимые для выполнения самой модели, а обратные вызовы (реализованные с помощью наблюдателей) являются отдельными обработчиками событий.
Я не думаю, что ваш второй вариант «плохой» или менее профессиональный. В любом случае он работает до тех пор, пока он находится на уровне модели, вместо контроллеров или (что еще хуже) видов.
Роман прав, но обратите внимание, что столбец auto_increment должен быть частью ПЕРВИЧНОГО КЛЮЧА или УНИКАЛЬНОГО КЛЮЧА (и почти в 100% случаев он должен быть единственным столбцом, составляющим ПЕРВИЧНЫЙ КЛЮЧ):
ALTER TABLE document MODIFY document_id INT AUTO_INCREMENT PRIMARY KEY
-121--633230- Прежде всего, распечатайте документацию о «безопасных/небезопасных» функциях от ms
fopen
Так же безопасно, как и fopen_s... Uless вы идиот и предполагаете, что возвращенный указатель не является NULL, или предоставьте NULL в качестве входного параметра.
vfprintf vsprintf sprintf
Только MS не поддерживает C99, используйте семейство snprintf
.
strncpy
Абсолютно безопасно, если вы прочитали руководство
strcpy strcat
Используйте strncpy
и strncat
и прочтите спецификации. (т.е. strncpy не может быть прерван null)
Так... Еще раз:
Распечатайте документацию о «безопасных/небезопасных» функциях от MSDN и сожгите ее!
-121--2881567-я бы пошел за наблюдателями, поскольку они уменьшают загромождение в коде модели/контроллера, и я не могу думать об их использовании...
iirc отправка сообщения электронной почты после сохранения является даже примером в активной документации наблюдателей за записями
Вы также можете сделать комбинацию вещей. Вы можете использовать наблюдателей для одного действия, а если есть только одно письмо для одного другого действия, вы можете использовать для него опцию #1.
Слышали ли вы о act_as_state_machine или о других подобных решениях?
http://github.com/rubyist/aasm
Они позволяют определить состояние каждого объекта и различные вещи, которые могут происходить при изменении состояния.
Это позволяет вам иметь столько логики, сколько вам нужно, когда вещи посылаются, если вы в этом нуждаетесь. Это может быть чересчур, но может быть очень удобно. Я предлагаю, потому что вы хотите, чтобы электронное письмо отправлялось, когда задача "выполнена", что звучит так, как будто это может быть тип состояния или столбец статуса в вашей модели задачи.