2012-01-03 8 views
0

別のフィールド選択に依存する数値の範囲内にあるフィールドを検証する必要があります。モデルのカスタム検証ルール内でfind( 'first')を実行する

例えば、

'rating' => array(
    'within class range' => array(
     'rule' => 'withinClassRange', 
     'message' => 'number not in range' 
    ) 
), 

public function withinClassRange($data) { 

    // get class range 
    $classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->data['Edition']['aclass_id']))); 
    if($data['rating'] < $classRange->minRange) { 
     return false; 
    } 
    if($data['rating'] > $classRange->maxRange) { 
     return false; 
    } 
    return true; 
} 

withinClassRange

が、この発見でのみ行うことができ、コントローラ内に。これをどのように実装すればよいですか?

答えて

0

実際にリクエストオブジェクトにデータを割り当てるべきではありません。要求オブジェクトを$dataなどの別の配列に割り当てて、そこで更新を行うか、範囲を検証関数に渡す方法を見つけます。

また、質問のfindステートメントは、オブジェクトではなく配列を返します。したがって、あなたの構文はそこでは有効ではありません。それはおそらく元の問題の原因です。

このような何かが動作するはずです:

public function withinClassRange($data) { 

    // get class range 
    $classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->data['Edition']['aclass_id']))); 
    if($data['rating'] > $classRange['Aclass']['minRange'] && $data['rating'] < $classRange['Aclass']['maxRange']) { 
     return true; 
    } 

    return false; 
} 
+0

おかげで、私はこれを試してみて、レポートします – khany

0

私はそれを手に入れました!

私がしたのは、データを取得し、コントローラー内の要求オブジェクトの範囲外の値として範囲制限を設定しました。 'save'コールの直前です。その後、モデルの比較を実行することができます。

//controller 
$classRange = $this->Edition->Aclass->find('first', array('conditions' => array('Aclass.id' => $this->request->data['Edition']['aclass_id']))); 
$this->request->data['Edition']['minRange'] = $classRange['Aclass']['minRange']; 
$this->request->data['Edition']['maxRange'] = $classRange['Aclass']['maxRange']; 

//model 
public function withinClassRange($data) { 
    if($data['rating'] < $this->data['Edition']['minRange']) { 
    return false; 
    } 
    if($data['rating'] > $this->data['Edition']['maxRange']) { 
    return false; 
    } 
    return true; 
} 
関連する問題