Я использую CFWheels для разработки приложения в ColdFusion.
У меня есть модель под названием Vote.cfc
. Прежде чем объект Vote можно будет создать, обновить или удалить, мне нужно получить объект сообщения из другой модели: Post.cfc
. Голос принадлежит сообщению. Пост имеет много голосов.
Используя данные из объекта post
, мне нужен объект to validate the vote
по нескольким критериям и нескольким функциям. Единственный способ, которым я могу думать о сохранении объекта сообщения, чтобы он был доступен для этих функций, - это сохранить его в области запроса.
Другие говорят, что это плохая практика. Но мне не удалось выяснить, почему. Я думал, что область запроса является потокобезопасной, и в этой ситуации имеет смысл использовать ее.
Моя другая альтернатива — загружать новый экземпляр объекта post в каждую функцию, которая его требует. Хотя Wheels использует кэширование, это привело к увеличению времени запросов на 250%.
ОБНОВИТЬ
Вот несколько образцов. Во-первых, контроллер проверяет, существует ли уже объект голосования. Если да, то удаляет, если нет, то создает. Функция контроллера по сути является функцией переключения.
Контроллер голосов.cfc
private void function toggleVote(required numeric postId, required numeric userId)
{
// First, we look for any existing vote
like = model("voteLike").findOneByPostIdAndUserId(values="#arguments.postId#,#arguments.userId#");
// If no vote exists we create one
if (! IsObject(like))
{
like = model("voteLike").new(userId=arguments.userId, postId=arguments.postId);
}
else
{
like.delete()
}
}
Модель VoteLike.cfc
После этого перед проверкой срабатывает обратный вызов, зарегистрированный в модели. Он вызывает функцию, которая извлекает объект записи, которому будет принадлежать голос. Функция getPost() сохраняет сообщение в области запроса. Теперь он доступен для множества функций проверки в модели.
// Load post before Validation via callback in the Constructor
beforeValidation("getPost");
private function getPost()
{
// this.postId will reference the post that the vote belongs to
request.post = model("post").findByKey(this.postId);
}
// Validation function example
private void function validatesIsNotOwnVote()
{
if (this.userId == request.post.userId)
{
// addError(message="You can't like your own post.");
}
}
Альтернативой функции getPost() является использование вызова с областью действия "this.post().userId
" для получения объекта сообщения как такового:
private void function validatesIsNotOwnVote()
{
if (this.userId == this.post().userId)
{
addError(message="can't vote on your own post")
}
}
Но тогда мне пришлось бы повторять этот ограниченный вызов this.post().userId
для КАЖДОЙ функции, что, как я думаю, замедляет запрос!
VoteLike
передается, а его методgetPost()
доступен другим объектам (например,Vote
), @Dan Short получил правильный ответ здесь, в комментариях. - person orangepips   schedule 03.02.2011