CFWheelsを使用して、ColdFusion でアプリケーションを開発しています。
というモデルがありVote.cfc
ます。Vote オブジェクトを作成、更新、または削除する前に、別のモデルから投稿オブジェクトを取得する必要があります: Post.cfc
. 投票は投稿に属します。投稿には多くの票があります。
オブジェクトからのデータを使用して、複数の基準と複数の機能にまたがるオブジェクトpost
が必要です。to validate the vote
post オブジェクトを永続化してそれらの関数で使用できるようにする唯一の方法は、それを request スコープに格納することです。
他の人は、これは悪い習慣だと言っています。しかし、私はその理由を見つけることができませんでした。リクエスト スコープはスレッド セーフであり、この状況で使用するのは理にかなっていると思いました。
もう 1 つの方法は、それを必要とするすべての関数で 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
その後、検証前にモデルに登録されたコールバックが発火します。投票が属する投稿オブジェクトを取得する関数を呼び出します。関数 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
あります。これが、リクエストの速度を低下させていると思います!