1

私は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

さて、私の質問です。ユーザーが回答に投票したら、そのユーザーとその特定の質問への投票を終了する必要があります...

プロジェクトの残りの部分では、ユーザーと承認にdeviseと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

4

2 に答える 2

2

私は個人的にデバイスの外に出て、自分のメソッドを書きます。少しすっきりしていてわかりやすいと思います。また、このメソッドを使用すると、DBに対して単一の高速クエリのみを実行することが保証されます。ユーザーが回答したすべての質問についてデータベースにクエリを実行することにより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) %>
于 2011-04-02T16:31:40.200 に答える
1

能力でこのようなものを書く

can :vote, Answer, :votes => { :users => user }

あなたの見解では、次のようなことをしてください

<% if can? :vote, Answer %>

(今は本当にテストできないので、うまくいくかどうか教えてください)

于 2011-04-02T16:08:53.997 に答える