と「最初の」または「作成」であるならば、私はこの文を使用しようとしている差別ん:は、どのように私は何かがfirst_or_create
@vote = Vote.where(:resource_id => params[:id], :user_id => current_user.id).first_or_create(:value => 1)
これはupvoteまたはdownvoteのためです。 DB内に行が存在しない場合は、それを作成する必要があります(投稿に投票したことはありません)。それ以外の場合は-1,0,1で値を変更する必要があります。
2回目にupvoteをクリックすると、投票を取り消して、1行ではなく0行に置く必要があります。同じことがdownvoteで起こりますが、これは現在upvote関数のみです。
レールでもこのステートメントのデバッグに問題があります。基本的には、保存されたレコードと作成されたレコードのどちらを区別する必要がありますか。私が入れた場合:
@vote = Vote.where(:resource_id => 25, :user_id => 1)
@vote.exists?
は私がtrue
を取得するが、私はこれを置けば...(とレコードが存在し、それだけで上記働いていた)..私は取得
@vote = Vote.where(:resource_id => 25, :user_id => 1).first_or_create(:value => 1)
@vote.exists?
を.. 。 NoMethodError:未定義のメソッド `exists? ' #
2つのオブジェクトのクラスを見ると、1つは「投票」で、1つは「ActiveRecord :: Relation」です。
私の究極の目標は、そう(ゼロに設定し、投票を元に戻す場合は何とかそうこれは1
でそれを置く)、投票値が既に1であれば、それはチェックこの(ほとんどの部分をリファクタリングすることです。私はfirst_or_createとリファクタリングしようとして始めた前に長いと醜いコード
if @vote.exists?
# Check if they have already voted
if @vote.first.value == 1
@vote.first.value = 0
else
@vote.first.value = 1
end
flash[:notice] = "previous vote modified"
@vote.first.save
else
# Create a new Vote instance, save it
@vote = Vote.new(:resource_id => params[:id], :user_id => current_user.id, :value => 1)
if @vote.valid?
@vote.save
flash[:notice] = "New vote added"
else
@vote.save
flash[:notice] = (@vote.errors.full_messages).to_s
end
end
ありがとうSteph!女性のルビー開発者は私のお尻をキッキン! – Tallboy
ハハ!私はちょうど前に、これらの方法の力に直面しました。 :) –
残念ながら、これらのメソッドはRails 4では廃止されています。したがって、この提案は現在とRailsの次のバージョンでは機能しますが、今後の互換性の問題が発生します。 –