Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

Tag - ruby

Fil des billets

mercredi 3 août 2016

Ruby hash et struct ils ont chacun leur cas d'utilisation

Si vous utilisez les hash pour stocker tout et n'importe quoi, vous allez perdre en performance. L'intérêt d'un hash est comme il se définit d'ailleurs un tableau indexé. Il vous permet de trouver (rechercher) un enregistrement par sa clé.

Si vous avez besoin de faire un cache local des utilisateurs d'un système par exemple le hash est bien adapté !

users = {}

# Stocke les utilisateurs dans un hash avec pour index la clé primaire de l'utilisateur : id

User.all.each{ |u| users[u.id] = u }

Par contre si vous avez besoin de stocker des infos d'un contact (nom, prénom, age, ...), c'est à dire une liste finie et connue de clé, il vaut mieux utiliser un struct :

# Ce qu'il ne faut pas faire

user = { :name => "MON NOM", :email => "bla@gmail.com" }

# Ce qu'il faut faire

U = Struct.new(:name, :email)

user = U.new("MON NOM", "bla@gmail.com")

Apparemment les struct seraient à peu près 100 fois plus performant que les hash. Donc pour résumer si les clés sont connues à l'avance utilisez des Structs.

mardi 19 juillet 2016

Ruby : attention à la base 8 (octal)

Hier un collège me dit, je comprends pas j'ai une erreur quand j'itère sur mon array.

Exemple simplifié du code : 

arr = [03,09,42,57]

Voici l'erreur :

Invalid octal digit

En fait en ruby vous pouvez déclarer un entier en hexa, décimal, binaire.

hexa : 0x81 => 129

binaire : 0b11 => 3

décimal : 42 => 42

octal : 010 => 8.

Le fait de mettre un zero devant permet de dire à ruby que l'on travaille avec des nombres en octal et en octal les digits 8, 9 n'existe pas, donc si vous faites 08 vous allez avoir une erreur (de la même manière que 0b2 va provoquer une erreur...).

En fait l'erreur vient du développeur qui met des 0 non significatif devant ses entiers...

vendredi 8 juillet 2016

Activer les logs sql dans la console rails

Une fois la console rails démarrée (rails c), il suffit de faire :

ActiveRecord::Base.logger = Logger.new STDOUT

mercredi 2 décembre 2015

Paranoia : suppression logique des objets ActiveRecord

Il peut être pratique de faire croire aux communs des mortels que vous supprimez réellement des objets quand ils cliquent sur le bouton de suppression et de ne pourtant pas supprimer ces enregistrements.

Vous pouvez coder ça vous même mais c'est bête ça existe déjà. Paranoia est là pour vous (rails 3 et 4). Il remplace acts_as_paranoid, en moins de code d'après son créateur.

Il suffit de rajouter une colonne deleted_at:datetime à vos classes ActiveRecord ainsi que spécifier acts_as_paranoid dans la classe et ça roule, plutôt que de me lancer dans des explications bancales, voici le lien du gem avec sa documentation :

https://github.com/radar/paranoia

Utiliser la forme réduite de rescue

Hello,

Il existe une forme raccourci de begin rescue

Au lieu de faire

begin
mon_objet.bidule
rescue
nil
end

on peut utiliser :

(mon_objet.bidule rescue nil)

mercredi 19 août 2015

Comment connaitre les changements qu'il y a eu sur un objet ActiveRecord immédiatement après un save ?


Avant de faire un save il est possible de connaitre les changements/savoir si un objet ActiveRecord a changé en appelant .changes ou changed?
Mais après un save ces fonctions renvoient respectivement [] et false. Il existe néanmoins la méthode previous_changes qui va renvoyer un hash avec la liste des attributes changés ainsi que leurs valeurs précédentes et actuelles.

mercredi 17 juin 2015

Comment ne plus utiliser le default_scope ?

Le default_scope est un scope qui est appelé implicitement à chaque requête ActiveRecord sur le modèle en question.

Le problème c'est qu'on l'oublie vite celui-là... Vaut mieux l'utiliser quand on a de bonnes raisons (un order systèmatique)...

En cas de nécessité absolu de ne pas utiliser le default_scope (c'est là qu'on doit légitimement se poser des questions, hein), il existe une méthode : unscoped. Elle vire tous les scopes précédemment utilisés, donc attention à l'ordre dans lequel vous le chaînez.

Documentation officielle sur ces deux méthodes : http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-default_scope

- page 1 de 16