Я работаю над внедрением на свой сайт системы репутации, аналогичной SO. Вот как это устроено:
User hasMany Project
User hasMany Answer
Project hasMany Rating
Ответ hasMany Rating
Рейтинг принадлежит проекту, где Rating.parent_type = Project
Рейтинг принадлежит ответу, где Rating.parent_type = Answer
Поле значения рейтинга будет числом от 1 до 5. Пользователь должен получить +10 за каждый отзыв с 5 звездами, +5 за каждый отзыв с 4 звездами и +1 за каждый отзыв с 3 звездами. В настоящее время я настроил его следующим образом: действие recalcRep($id) в UsersController (наряду с другими действиями в других контроллерах, когда это необходимо) вызывает метод calcRep($id) внутри модели User, который должен вычислить репутацию пользователя с идентификатором $id.
public function calcRep($id) {
$rep = 0;
$data = $this->Rating->find('all'); //does not work, because it is not directly associated
foreach($data as $rating) {
if(($rating['Rating']['parent_type'] == 'Project' && $rating['Project']['user_id']==$id) or ($rating['Rating']['parent_type'] == 'Answer' && $rating['Answer']['user_id']==$id)) {
if($rating['Rating']['value']==5) {
$rep += 10;
} else if($rating['Rating']['value']==4) {
$rep += 5;
} else if($rating['Rating']['value']==3) {
$rep += 2;
}
}
}
$data['User']['reputation'] = $rep;
$this->save($data);
}
Возможно, я подхожу к этому совершенно неправильно, но я не могу понять, как найти все рейтинги, принадлежащие любому из детей определенного пользователя.