12-08-2011, 05:23 PM
(Modification du message : 12-08-2011, 05:26 PM par Sephi-Chan.)
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 :
Et voici le code du modèle Game :
J'aurais l'occasion de mettre d'autres exemples tirés du jeu !
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 !