我正在使用CFWheels在 ColdFusion 中开发应用程序。
我有一个模型叫Vote.cfc
. 在创建、更新或删除 Vote 对象之前,我需要从另一个模型中获取 post 对象:Post.cfc
. 投票属于帖子。一个帖子有很多票。
使用来自post
对象的数据,我需要to validate the vote
跨多个标准和多个功能的对象。我能想到的唯一方法是持久化 post 对象以便这些函数可以使用它,就是将它存储在请求范围内。
其他人说这是不好的做法。但我无法找出原因。我认为请求范围是线程安全的,在这种情况下使用它是有意义的。
我的另一种选择是在每个需要它的函数中加载 post 对象的新实例。尽管 Wheels 使用缓存,但这样做会导致请求时间增加 250%。
更新
这是一些示例。首先,控制器处理查看投票对象是否已经存在。如果是,它会删除它,如果不是,它会创建它。控制器功能本质上是一个切换功能。
Votes.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
之后,模型中注册的回调会在验证之前触发。它调用一个函数来检索投票所属的 post 对象。函数 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
”来获取 post 对象,如下所示:
private void function validatesIsNotOwnVote()
{
if (this.userId == this.post().userId)
{
addError(message="can't vote on your own post")
}
}
但是我必须this.post().userId
对每个函数重复这个范围调用,这就是我认为减慢请求的原因!