如何检查用户是否已投票?

时间:2017-05-18 16:07:04

标签: mongodb angular typescript mongoose

状况:

目前,我在我的User中存储了一个对象数组,其中包含了他所投的所有选票。

以下是模型:

var schema = new Schema({
    firstName: {type: String, required: true},
    lastName: {type: String, required: true},
    password: {type: String, required: true},
    email: {type: String, required: true, unique: true},
    polls: [{type: Schema.Types.ObjectId, ref: 'Poll'}]
    votes: [{
      poll: {type: Schema.Types.ObjectId, ref: 'Poll'},
      choice: {type: number}
    }]
});

当用户选择一个选项时,会在我的服务中触发此方法:

voteOn(poll: Poll, userID: string, choice: number) {
        UserModel.findById(userID, function (err, user) {
          user.votes.push({poll, choice });
          const body = JSON.stringify(user);
          const headers = new Headers({'Content-Type': 'application/json'});
          const token = localStorage.getItem('token')
              ? '?token=' + localStorage.getItem('token')
              : '';
          return this.http.patch('https://voting-app-10.herokuapp.com/user'+token, body, {headers: headers})
              .map((response: Response) => response.json())
              .catch((error: Response) => {
                  this.errorService.handleError(error);
                  return Observable.throw(error);
              })
              .subscribe();
        });
    }

此方法保存用户投票的投票以及他在用户的投票数组中做出的选择。

我的问题如下:

问题:

当民意调查加载时,我想显示用户已经投票的民意调查显示他已经预选的选择以及阻止他多次投票。

我怎样才能做到这一点?

以下是我的服务中获取民意调查的方法:

getPolls() {
        return this.http.get('https://voting-app-10.herokuapp.com/poll')
            .map((response: Response) => {
                const polls = response.json().obj;
                let transformedPolls: Poll[] = [];
                polls.reverse();
                for (let poll of polls) {
                    transformedPolls.push(new Poll(
                        poll.title,
                        poll.choice1,
                        poll.choice2,
                        poll.counter1,
                        poll.counter2,
                        poll.user.firstName,
                        poll._id,
                        poll.user._id,
                        )
                    );
                }
                this.polls = transformedPolls;
                return transformedPolls;
            })
            .catch((error: Response) => {
                this.errorService.handleError(error);
                return Observable.throw(error);
            });
    }

这是民意调查的component.html:

<article class="panel panel-default">
    <div class="panel-body">
      {{ poll.title }}
      <br>
      <br>
      <form #form="ngForm">
        {{ poll.counter1 }} votes <input type="radio" id="{{ poll.choice1 }}" name="my_radio" value="{{ poll.choice1 }}" (click)="onChoice1(form)">  {{ poll.choice1 }}
        <br>
        {{ poll.counter2 }} votes <input type="radio" id="{{ poll.choice2  }}" name="my_radio" value="{{ poll.choice2 }}" (click)="onChoice2(form)">  {{ poll.choice2 }}
      </form>

    </div>
    <footer class="panel-footer">
        <div class="author">
            {{ poll.username }}
        </div>
        <div class="config" *ngIf="belongsToUser()">
            <a (click)="onEdit()">Edit</a>
            <a (click)="onDelete()">Delete</a>
        </div>
    </footer>
</article>

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。

在不更改当前数据模型的情况下,您需要将poll.id与user.votes [pollIndex] .id进行比较,如果它们与轮询上的禁用输入匹配。来自ReactJS背景我可以建议如何做到这一点,但IDK有角度。

如果我要接管这个项目,我可能会制作一个名为Vote或UserPoll的新Mongo架构,如:

{
    user: {type: Schema.Types.ObjectId, ref: 'User'),
    poll: {type: Schema.Types.ObjectId, ref: 'Poll'},
    choice: {type: number}
}

然后,如果用户想要进行轮询,请使用当前用户和轮询创建新的UserPoll对象。然后你可以找到当前用户所在的所有UserPolls,然后根据是否有选择使用数组过滤器。

希望这是有道理的。