J’ai depuis avant-hier un objectif : réaliser une petite appli Twitter pour comparer les followers de plusieurs personnes et y trouver ceux qui sont en communs. Je l’avais fait en Ruby, et ça marchait très bien d’ailleurs (à mon étonnement), ça m’avait surpris à quel point c’était simple. Puis j’ai voulu ajouter une interface graphique à cet outil en Ruby, en utilisant uniquement du Ruby. Mais je n’ai pas réussi. Je me suis dit que je n’avais qu’à utiliser Rails, en incorporant mon code Ruby. J’ai galéré et je galère encore.
Là je n’apprends plus Rails pour apprendre Rails mais pour aboutir à quelque chose. L’avantage, c’est d’avoir un intérêt grandissant pour apprendre. Le désavantage c’est que je risque de brûler des étapes. Je veux à tout prix arriver à faire fonctionner cette appli sous Rails mais je n’y arrive pas. Je devrais peut-être reprendre le cours normal de mon apprentissage, mais je me dis que je n’ai jamais autant lu à propos de Rails que ces 2 derniers jours. Au bout du compte, je n’arriverai peut-être pas à créer cette appli (ou peut-être d’une façon peu optimale) mais au moins j’aurais lu pleins de choses sur les routes, les formulaires ou le type de données dans la base de données.
Les routes et les formulaires, ce sont des chapitres long et complexes. J’ai appris quelques trucs mais je ne maîtrise pas encore. Aujourd’hui je vais juste parler des types de données.
Pour mon appli Twitter, j’ai voulu repartir de zéro et j’ai créé un Model User qui aurait 3 éléments :
- id : l’identifiant Twitter (bbx par exemple)
- name : le vrai nom du compte
- followers : un Array comportant tous les id des followers
Alors j’ai fait ça :
ruby script/generate model User id:integer name:string followers:array
Ca avait l’air de marcher, jusqu’à ce que je lance la migration (rake db:migrate) et que je reçoive l’erreur :
undefined method 'array' for ActiveRecord::ConnectionAdapters::TableDefinition
Je me doutais bien que ce followers:array poserait problème. Un tableau comme champ dans une table MySQL ? Evidemment, ça ne pouvait pas marcher. Il faut que je crée une autre table et que je lis les deux (comme Post avec Comment).
Je suis quand même allé voir la page à propos de la classe ActiveRecord::ConnectionAdapters::TableDefinition pour lire ça :
The type parameter is normally one of the migrations native types, which is one of the following: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.
C’est le type de données que l’on peut mettre dans une base de données. Il y en a d’autres, mais Rails préconise de ne pas les utiliser.
Ok, et bien je suis parti pour créer 2 modèles : un pour User, un pour Follower, et récupérer les infos avec l’API Twitter, les sauvegarder dans ma base de données (même si à terme, je veux éviter ça parce que ces données changent constamment) puis comparer à partir de là.
Flux RSS
Coucou,
Je pense que la solution a ton problème, c’est d’utiliser les associations (de model).
En fait, tu auras (je suppose) un model Follower. Tu comptais utiliser les id dans le fameux Array. Et tu as ton model User.
Tu peux considérer qu’un User possède plein de Followers, et que les Followers peuvent appartenir à plein de Users différents.
Du coup, l’association dont tu as besoin, c’est : has_and_belongs_to_many
C’est un peu compliqué à mettre en place au début, mais c’est extrêmement puissant. Pas trop de place pour tout expliquer dans le commentaire
[...] Pour me relancer, je vais repartir sur cette appli Twitter et essayer de la terminer. J’en étais arrivé à repenser le truc depuis le début. [...]