JeuWeb - Crée ton jeu par navigateur
Squeel, le compagnon parfait de Rails 3.1 - 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 : Squeel, le compagnon parfait de Rails 3.1 (/showthread.php?tid=5639)



Squeel, le compagnon parfait de Rails 3.1 - Sephi-Chan - 12-08-2011

Hello,

Je viens vous présenter Squeel, le compagnon parfait d'ActiveRecord depuis Rails 3.1.
Ce projet est le successeur de MetaWhere qui reste excellent si vous êtes encore sous Rails 3.

Le but de Squeel est de débarrasser les appels à ActiveRecord de fragment de SQL avec une API qui tire profit de Arel.

En pratique, ça on utilise les mêmes méthodes qu'avec l'API classique mais on leur donne des blocks en argument plutôt que des chaînes et des hash. Ça permet de produire des requêtes SQL avec une lisibilité exemplaire, mêmes dans des cas un peu poilus.

La page de présentation est plutôt riche en exemples donc je ne vais en rajouter quelques uns que j'expérimente alors que je développe Conquest on Rails.


Voici l'exemple du système de recherche de partie, très simple :
  • On recherche une partie qui a encore de la place (not_full) et qui n'a pas déjà le joueur courant parmi ses participants (without) ;
  • S'il y a plusieurs parties, on en prend une au hasard (sample) ;
  • Si aucune partie ne correspond, on en crée une à la volée.


class GamesController < ApplicationController
# Find an appropriate game for the user.
def find
@game = Game.not_full.without(current_user).sample || Game.create
@game.users << current_user

redirect_to @game
end
end


Et voici le code du modèle Game :


class Game < ActiveRecord::Base
MAXIMUM_PARTICIPATIONS_COUNT = 5

has_many :ownerships
has_many :participations
has_many :users, through: :participations


# Only keep the open games.
def self.not_full
where { participations_count < Game::MAXIMUM_PARTICIPATIONS_COUNT }
end


# Exclude the games in which the user is.
def self.without(user)
joins { participations }.
where { participations.user_id != user.id }
end
end

J'aurais l'occasion de mettre d'autres exemples tirés du jeu ! Smile


RE: Squeel, le compagnon parfait de Rails 3.1 - Viciousity - 12-08-2011

Je connaissais pas, j'adopte Smile

Le système de hash et d'opérateur direct est vraiment sympa ^^