我从php转到rails3,我仍然认为这是一个很好的决定!无论如何我有一些模特:
users
questions
answers
question_id
votes
user_id
answer_id
用户模型:
has_many :questions
has_many :votes
问题模型:
belongs_to :user
has_many :answers, :dependent => :destroy
accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:text].blank? }, :allow_destroy => true
答案模型:
belongs_to :question
has_many :users, :through => :votes, :dependent => :destroy
has_many :votes
投票模型:
belongs_to :answer
belongs_to :user
现在我的问题是,一旦用户投票给答案,该用户和该特定问题的投票应该被关闭......
我在项目的其余部分使用设计和cancan用户和授权......
在我看来,它应该看起来像:
<% unless current_user.question_answered.include? question %>
然后执行我渲染投票按钮的脚本......
在我的投票模型中,我有一个 answer_id和user_id,我知道 current_user.id和当前的question.id 所以如果vote.user_id有当前question.id中的vote.answer_id,那么它不应该让我的按钮制作脚本... aarghh但是如何让它工作......?
非常感谢! 最好的问候, Thijs
答案 0 :(得分:2)
我会亲自走出设计并编写自己的方法。我认为它更清洁,更容易理解。您还可以使用此方法保证只对数据库执行单个快速查询。通过询问current_user.questions_answered
您正在查询用户已回答的所有问题的数据库,这可能是一个比检查用户是否已对当前问题投票更大的结果集:
class User
def can_vote_on? question
!question.answers.joins(:votes).where('votes.user_id = ?', id).exists?
end
end
然后,您可以将视图调整为:
<% if current_user.can_vote_on?(question) %>
答案 1 :(得分:1)
能力写这样的东西
can :vote, Answer, :votes => { :users => user }
在您的视图中执行类似
的操作<% if can? :vote, Answer %>
(我现在无法真正测试它,所以让我知道它是否有效)