rails3模型问题

时间:2011-04-02 13:59:06

标签: ruby-on-rails ruby-on-rails-3 has-many-through rails-models has-many-polymorphs

我从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

2 个答案:

答案 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 %>

(我现在无法真正测试它,所以让我知道它是否有效)