JeuWeb - Crée ton jeu par navigateur
[Résolu][Rails] Utilisation de classe personnalisée pour la composition - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu][Rails] Utilisation de classe personnalisée pour la composition (/showthread.php?tid=5714)

Pages : 1 2


[Résolu][Rails] Utilisation de classe personnalisée pour la composition - Maz - 28-09-2011

Bonsoir, aussitôt dis, aussitôt fait.

J'aimerais juste savoir ou doit-on placer ses class personnalisé? J'ai créé une class Point:
class Point
attr_reader :x, :y

def initialize(point)
parts = point[1,-2].split(",");
@x = parts[0].to_i
@y = parts[1].to_i
end
end
Que j'essaie d'utiliser dans ma class Character:
class Character < ActiveRecord::Base
composed_of :position, :class_name => "Point", :mapping => %w(position point)
end

Mais toujours impossible d'accéder aux propriétés x et y de l'objet Character. Dur de trouver des exemples sur le net de composition différent de celui de la doc, et aucune explications sur ou placer ses fichiers...

Merci d'avance.

Edit: oups, oublié l'erreur:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.split

Edit²: Ahh, trouvé l'erreur! j'ai utilisé [1..-2] à la place de [1,-2], ça fonctionnes à merveille, désolé pour le dérangement, si j'avais pu, j'aurais delete le post!


RE: [Rails]Utilisation de class pessonalisé. Composition. - Sephi-Chan - 28-09-2011

J'ai la sensation que tu ne fais pas beaucoup d'effort pour comprendre le mécanisme. Tu devrais lire la documentation du module ActiveRecord::Aggregations::ClassMethods plus attentivement.

Pour te mettre un peu sur la voie :
  • Oublie ton type composite et essaye d'appliquer le cas d'exemple à ta situation. Ils composent un objet Address à partir de plusieurs autres colonnes (street et city). A partir de quoi pourrais-tu composer un Point ?
  • Explique-moi comment penses-tu que le mapping fonctionne ?




RE: [Rails] Utilisation de class pessonalisé. Composition. - Sephi-Chan - 28-09-2011

Tu peux mettre ta classe dans un fichier placé parmi tes modèles.

À ta place, j'aurais plutôt utilisé 2 colonnes de type entiers : X et Y.
Voilà ce qu'aurait donné mon code :


class Character < ActiveRecord::Base
composed_of :position, class_name: "Point", mapping: [ %w( x x ), %w( y y) ]
end


class Point
attr_reader :x, :y

def initialize(x, y)
@x = x
@y = y
end
end



RE: [Rails] Utilisation de class pessonalisé. Composition. - Maz - 28-09-2011

Mais je ne peut faire ainsi! Etant donné que tout ce qui m'est retourné de la bdd est en String! c'est justement séparé x et y que je cherches à faire! Sinon je n'utiliserais pas de composition Confusediffle:

Quoi qu'il en soit. J'ai fait quelque test et ça bloque au niveau des assignations:
@city.position = City.where_to_live!
Me renvoi l'erreur: undefined method `point' for #<Point:0xb48992c @x=7, @y=2>

(La fonction where_to_live! permet de définir la position de la cité sur la carte à sa création d'après mon fameux (pas tant que ça ,P) script de spirale carré. La fonction renvoi un objet de type Point. La fonction fonctionnes(wow), puisque comme on peut le voir dans le message d'erreur, les variables sont bien rempli par le retour de cette fonction).

Edit: Après réflection je me suis dis que j'aurais peut-être besoin un jour d'instancier un objet Point avec x et y (par exemple lorsque c'est moi qui définirais les coordonnées). J'ai donc amélioré mon petit bout de code, voici ma class actuellement fonctionnelle:
class Point
attr_reader :x, :y

def initialize(args)
if args[Confusedtring]
string = args[Confusedtring]
parts = string[1..-2].split(",");
@x = parts[0].to_i
@y = parts[1].to_i
elsif args[:x] && args[:y]
@x = args[:x]
@y = args[:y]
end
end

def ==(other_point)
x == other_point.x && y == other_point.y
end
end

Edit²: Ok, erreur résolu:
def point
"(#{x},#{y})"
end
Pas pigé mais fonctionnel.. o.0 Si quelqu'un comprends le pourquoi du comment...

Maintenant erreur à l'affichage dans les vues:
can't convert Symbol into Integer
ça approches... en espérant que ce soit la dernière --'

Edit³: Ok, j'ai trouvé le problème, si je fait:
def initialize(db_record)
string = db_record
parts = string[1..-2].split(",");
@x = parts[0].to_i
@y = parts[1].to_i
end
ça fonctionnes dans la vue, probablement PgSQL qui appelles cette méthode avec la valeur du champs position. Demain je ferais un mix des deux méthodes, et je penses que ce seras bon.

Merci.


RE: [Rails] Utilisation de class pessonalisé. Composition. - Sephi-Chan - 29-09-2011

(28-09-2011, 10:49 PM)Maz a écrit : Mais je ne peut faire ainsi! Etant donné que tout ce qui m'est retourné de la bdd est en String! c'est justement séparé x et y que je cherches à faire! Sinon je n'utiliserais pas de composition Confusediffle:

Explique-moi pourquoi tu tiens tant à garder ce champ de type Point dans ta base de données puisque tu ne l'utilises plus comme tel. Changer ton schéma pour utiliser 2 entiers qu'une chaîne, est-ce si difficile ?

L'utilisation de la composition, c'est juste pour te permettre de manipuler un objet (qui a donc ses propres méthodes) plutôt que plusieurs attributs. Ainsi, tu pourrais faire des choses comme :


character = Character.new(params[:character])
character.position = Point.new(1, 4)
character.save

target = Character.find(53)

character.position.distance_from(target.position)

Et ainsi, tu extrais de ta classe Character la logique géographique.


RE: [Rails] Utilisation de class pessonalisé. Composition. - Maz - 29-09-2011

Je tiens à garder le champs en type point pour pouvoir l'utiliser dans les fonctions spatiales et les opérateur de comparaisons proposées par PostgreSQL.
Tu serais d'avis de recoder toutes les fonctions qui pourraient m'être utiles? Certains opérateurs assez complexe me seront probablement utiles, du genre circle '((0,0),2)' @> point '(1,1)' qui retourne un booléen pour savoir si le point est dans le cercle...


RE: [Rails] Utilisation de class pessonalisé. Composition. - Sephi-Chan - 29-09-2011

Ces fonctions ont l'air d'opérer sur des chaînes de caractères, tu peux donc ajouter à ton objet Point des méthodes qui délégueront l'opération au serveur PostgreSQL.

À toi de voir.


RE: [Rails] Utilisation de class pessonalisé. Composition. - Maz - 29-09-2011

(29-09-2011, 06:49 PM)Sephi-Chan a écrit : Ces fonctions ont l'air d'opérer sur des chaînes de caractères, tu peux donc ajouter à ton objet Point des méthodes qui délégueront l'opération au serveur PostgreSQL.

À toi de voir.

Je penses que c'est "coder pour rien". Après je me trompes peut-être, je rencontrerais peut-être des problèmes lorsque je voudrais utiliser ces fonctions et changerais peut-être d'avis, mais en attendant avec les éléments que j'ai je reste sur ma position. J'ai terminé de codé ma class 100% fonctionnelle. Je la posterais dans les ressources lorsque je serais sur de sa fiabilité.


RE: [Rails] Utilisation de class pessonalisé. Composition. - Sephi-Chan - 29-09-2011

Comment comptes-tu intégrer ces opérations au sein de ton code (c'est un exemple de code que j'attends) ?


RE: [Rails] Utilisation de class pessonalisé. Composition. - Maz - 29-09-2011

(29-09-2011, 07:39 PM)Sephi-Chan a écrit : Comment comptes-tu intégrer ces opérations au sein de ton code (c'est un exemple de code que j'attends) ?
Comme tu me l'as appris quelquepart:

Class Circle
def contain(point)
where('? @> ?', to_s, point.to_s)
end
end

*A peur de se faire taper sur les doigts*