02-10-2011, 07:44 PM
(Modification du message : 02-10-2011, 08:50 PM par Sephi-Chan.)
Edit:Lisez la fin en premier.
Bonsoir, suite à mon implémentation grâce aux méthodes agrégation des class Point et Path, je suis confronté au problème d'enregistrement des modifications dans la base de donnée.
J'ai une ressource Hunting qui contient une ressource path, de type path. Le type path est composé de plusieurs objet de type point.
J'aimerais créé un cron qui exécutes une fonctions qui supprime le premier point du path, si path vaut ((3,5),(6,4),(6,2)) il deviendras: ((6,4),(6,2)). J'ai déjà coder cette fonction, qui marches parfaitement, mon problème est que lorsque j'exécute un @hunting.save, rien n'est enregistré, et pour cause, rails n'est pas au courant du changement du fait que je passes par une fonction personnalisée et non par un simple "path = newpath". J'ai donc cherché et je suis tombé sur le module Dirty, que j'ai essayé d'implémenter:
J'ai fait quelques tests avec la console rails dont voici les résultats:
Comme vous pouvez le voir, la fonction "one_step_forward" fonctionnes bien, mais le changement n'est pas "capté" par rails.
J'ai déjà essayer tout un tas de combinaison dans mon code, mais rien n'y fait.
Une piste?
Merci.
Edit: Grrrrr, suffisait de reboot la console, 2h que je suis sur ce foutu truc! Leçon retenue: La console c'est bien, dans certains cas.
Edit²: Bon ça n'enregistres toujours pas les changements, mais c'est encore une autre histoire.
Bonsoir, suite à mon implémentation grâce aux méthodes agrégation des class Point et Path, je suis confronté au problème d'enregistrement des modifications dans la base de donnée.
J'ai une ressource Hunting qui contient une ressource path, de type path. Le type path est composé de plusieurs objet de type point.
J'aimerais créé un cron qui exécutes une fonctions qui supprime le premier point du path, si path vaut ((3,5),(6,4),(6,2)) il deviendras: ((6,4),(6,2)). J'ai déjà coder cette fonction, qui marches parfaitement, mon problème est que lorsque j'exécute un @hunting.save, rien n'est enregistré, et pour cause, rails n'est pas au courant du changement du fait que je passes par une fonction personnalisée et non par un simple "path = newpath". J'ai donc cherché et je suis tombé sur le module Dirty, que j'ai essayé d'implémenter:
class Hunting < ActiveRecord::Base
composed_of :path, :class_name => "Path", :mapping => %w(path path), :converter => Proc.new { |path| "((6,6),(6,7))" }
def one_step_forward
path_will_change!
path.points.delete_at(0)
end
end
J'ai fait quelques tests avec la console rails dont voici les résultats:
ruby-1.9.3-rc1 :092 > @hunting = Hunting.find(1)
Hunting Load (0.5ms) SELECT "huntings".* FROM "huntings" WHERE "huntings"."id" = $1 LIMIT 1 [["id", 1]]
=> #<Hunting id: 1, path: "((7,6),(5,4))", created_at: "2011-10-02 16:02:11", updated_at: "2011-10-02 16:46:57">
ruby-1.9.3-rc1 :093 > @hunting.one_step_forward
=> #<Point:0xb171884 @x=7, @y=6>
ruby-1.9.3-rc1 :094 > @hunting.path.to_str
=> "((5,4))"
ruby-1.9.3-rc1 :095 > @hunting.changed?
=> false
Comme vous pouvez le voir, la fonction "one_step_forward" fonctionnes bien, mais le changement n'est pas "capté" par rails.
J'ai déjà essayer tout un tas de combinaison dans mon code, mais rien n'y fait.
Une piste?
Merci.
Edit: Grrrrr, suffisait de reboot la console, 2h que je suis sur ce foutu truc! Leçon retenue: La console c'est bien, dans certains cas.
Edit²: Bon ça n'enregistres toujours pas les changements, mais c'est encore une autre histoire.