Rails comment mettre à jour une colonne après l'enregistrement?
Je veux créer un after_save méthode pour mon taux de l'action. Il serait diviser rating_score/cotes et de mettre à jour la colonne de notation.
class KonkurrancersController < ApplicationController
def rate
@konkurrancer = Konkurrancer.find(params[:id])
@container = "Konkurrancer"+@konkurrancer.id.to_s
@konkurrancer.rating_score += params[:vind][:rating].to_i
@konkurrancer.ratings += 1
@konkurrancer.save
respond_to do |format|
format.js
end
end
end
C'est mon modèle:
class Konkurrancer < ActiveRecord::Base
after_save :do_foobar
private
def do_foobar
rating_score = self.rating_score
ratings = self.ratings
rating = (rating_score/ratings)
self.update_attributes(:rating => rating)
end
end
Mon rails journal:
Started POST "/konkurrancers/rate/46" for 127.0.0.1 at 2011-04-26 23:40:56 +0200
Processing by KonkurrancersController#rate as */*
Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>"MACFM37hX4S6XA9vryn7gtfl21P
vcaPBSiKDI8mfurg=", "vind"=>{"rating"=>"4"}, "id"=>"46"}
←[1m←[36mKonkurrancer Load (1.0ms)←[0m ←[1mSELECT `konkurrancers`.* FROM `kon
kurrancers`←[0m
←[1m←[35mCACHE (0.0ms)←[0m SELECT `konkurrancers`.* FROM `konkurrancers`
←[1m←[36mCACHE (0.0ms)←[0m ←[1mSELECT `konkurrancers`.* FROM `konkurrancers`←
[0m
←[1m←[35mKonkurrancer Load (1.0ms)←[0m SELECT `konkurrancers`.* FROM `konkurr
ancers` WHERE (`konkurrancers`.`cached_slug` = '46') LIMIT 1
←[1m←[36mSQL (2.0ms)←[0m ←[1mSELECT sluggable_id FROM slugs WHERE ((slugs.slu
ggable_type = 'Konkurrancer' AND slugs.name = '46' AND slugs.sequence = 1))←[0m
←[1m←[35mKonkurrancer Load (1.0ms)←[0m SELECT `konkurrancers`.* FROM `konkurr
ancers` WHERE (`konkurrancers`.`id` = 46) LIMIT 1
←[1m←[36mSQL (0.0ms)←[0m ←[1mBEGIN←[0m
←[1m←[35mLink Load (1.0ms)←[0m SELECT `links`.* FROM `links` WHERE (`links`.k
onkurrancer_id = 46) LIMIT 1
←[1m←[36mSQL (0.0ms)←[0m ←[1mROLLBACK←[0m
Rendered konkurrancers/_rating.html.erb (1.0ms)
Rendered konkurrancers/rate.js.erb (22.0ms)
Completed 200 OK in 606ms (Views: 286.0ms | ActiveRecord: 6.0ms)
Comment dois-je créer?
voir ce rappels
OriginalL'auteur Rails beginner | 2011-04-25
Vous devez vous connecter pour publier un commentaire.
ce que vous voulez est un rappel. Vous pouvez créer un after_save de rappel sur votre Konkurrancer modèle, qui déclenche après la save() méthode est appelée pour ce modèle.
Par exemple:
[MODIFIER] Vous devez utiliser auto, puisque le modèle que vous modifiez est le modèle lui-même. Un Test, et appliquer la logique nécessaire/mise en œuvre.
Jetez un oeil à cette guide pour plus d'info.
Espère que ça aide!
J'ai mis à jour ma réponse
J'ai mis à jour ma réponse, avec un exemple de bloc de code qui est censé ressortir votre question. Le modifier selon vos besoins.
Mais n'est-ce pas un moyen de tomber dans une boucle infinie, car update_attributes appellerons modèle.enregistrer à nouveau pour faire le rappel de tir de nouveau?
Oui Nozim, cela va aller dans une récursivité sans fin et ne sera jamais fait. La bonne façon de le faire est d'utiliser
self.update_column
comme par Zakelfassi de réponse.OriginalL'auteur
Tout
update_attribute
dans unafter_save
de rappel sera la cause de la récursivité, dans Rails3+.Ce qui doit être fait est la suivante:
OriginalL'auteur
Ne sais pas pourquoi les gens sont upvoting la mauvaise réponse et downvoting la bonne réponse.
Zakelfassi est droit et Christian Fazzini est mauvais pour Rails 3 et ci-dessus. Si vous n' #update_attributes dans un enregistrer de rappel vous allez dans une récursivité sans fin. Vous voulez faire #update_column que par son exemple.
L'essayer pour vous-même et vous verrez.
Ouais, je ne peux que supposer qu'ils utilisent une ancienne version de Rails.
Veuillez noter que la question de départ, et l'on a accepté la réponse de Christian Fazzini sont à la fois à partir de 2011. Les Rails version est presque certainement 2.x.
OriginalL'auteur
OriginalL'auteur
voir ce after_save méthode
OriginalL'auteur