Vous le savez probablement déjà, il est possible, avec Active Record, de faire vos conditions proprement de deux manières différentes :
Model.find(:all, :conditions => ['champ = ?', valeur])
Model.find(:all, :conditions => {:champ => valeur})

Le second est plus propre. Cependant à première vue, il n’est pas possible d’y faire des conditions autres que le égal (=).
Du coup dès que votre condition devient un chouilla complexe, il deviendrait nécessaire d’utiliser les crochets. C’est dommage.

Heureusement, il des conditions autres que le = sont gerées avec les hashes.
Petit exemple de requête
Model.find(:all, :conditions=>{
:title => "Title",          # title='Title'
:published_at => (Date.now-30 .. Date.now),  # published_at BETWEEN xxx AND xxx
:rating => [ 4, 5, 6 ],          # rating IN ( 4, 5, 6 )
:content => /(a|b|c)/          # REGEXP '(a|b|c)'
)

Cela permet déjà de faire quelques requêtes supplémentaires. Cependant dès que l’on va vouloir faire des choses comme des LIKE, des !=, des >= ou des <=, nous allons, de toute façon, devoir passer par des tableaux.

Petit billet très rapide parce que j’ai pas mal galéré là-dessus. Donc autant en fait profiter.

Lorsque vous cherchez à installer le gem mysql sous mac, vous avez probablement eu de multiples erreurs de ce type :
ERROR: Error installing mysql:
ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***

Voici ce que j’ai fait pour résoudre le problème :
sudo gem install mysql -- --with-mysql-include=/opt/local/include/mysql5 --with-mysql-lib=/opt/local/lib/mysql5 --with-mysql-config=/opt/local/lib/mysql5/bin/mysql_config
Note : j’ai mysql5 d’installé évidemment (mysql5-devel même à vrai dire).

Et du coup je saute de joie en voyant le beau

Successfully installed mysql-2.7
1 gem installed

Pour l’instant du moins.

Comme vous le savez peut-être déjà, Zend a publié hier la première beta publique de son Zend Server.
L’idée est en soi sympa. Le produit, qui a des versions Windows, Mac et Linux, inclut :

  • Apache (ou le support de IIS si vous êtes un grand fou sous windows)
  • PHP
  • Zend Framework
  • MySQL (optionnel)

Alors après un petit test rapide, le produit est sympa.
L’interface web d’administration du serveur est toute jolie, ergonomique toussa (même si sans licence on ne peut pas voir grand chose).
A savoir qu’elle a été développée avec le Zend Framework et Dojo.

Mais cette interface ne permet de gérer que PHP, les extensions installées et les logiciels Zend installés.
C’est bien maigre lorsque l’on sait que pour faire fonctionner PHP il faut aussi un Apache correctement configuré. Du coup pour configurer son Apache, il faut passer par le fichier de configuration normal.

Ainsi en « natif », pas de multi projets. Vous placez votre application développée avec Zend à la base du DocumentRoot et puis c’est tout.
Quand j’ai vu l’interface, j’ai tout de suite pensé à une génération automatique de virtualhosts moi (je me suis même pris à rêver de modification automatique du fichier hosts, c’est dire).

Pour finir le Apache utilisé est celui disponible chez apache.org, sans aucune implémentation native dans le Zend Server.
Du coup vous avez (sous windows) deux icônes, une pour le ZS et une pour Apache. Quand des logiciels comme WAMP sont capables de monitorer seuls le serveur http ainsi que le serveur mysql, c’est plutôt dommage.

Du coup je me tâte pour regarder si ce serveur est intégrable à wamp justement. Même si l’intérêt en est finalement assez faible puisque ce dernier permet de gérer les extensions php installées de manière parfaitement correcte.

Du coup je vire le Zend Server et je reste avec wamp pour l’instant. On verra d’ici un an ou deux si la version stable intègre une gestion plus avancée des serveurs http et mysql.

P.S. : Aujourd’hui, O2Sources vient de sortir son premier projet Open Source, développé avec Zend Framework justement.

Je publie ce billet un peu rapidement comme une note car j’ai eu du mal à trouver l’information lorsque j’en ai eu besoin.

La documentation de Zend Framework n’indique que les informations de connexion pour SQLite dans app.ini.
Mais tout le monde n’utilise pas SQLite (et pour donner un avis totalement personnel, je dirais heureusement).

Voici donc les informations requises pour la configuration de MySQL dans votre application utilisant Zend Framework.

[general]
database.adapter = "MYSQLI"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

Et puis rien que pour le fun, Oracle :
[general]
database.adapter = "Oracle"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

SQL Server
[general]
database.adapter = "Pdo_Mssql"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

Et PostgreSQL
[general]
database.adapter = "Pdo_Pgsql"
database.params.host = "localhost"
database.params.username = "root"
database.params.password = ""
database.params.dbname = "myDatabase"

Je procéderais à une maintenance sur le serveur qui héberge ce blog (ainsi que RefStats).
La raison de celle-ci est assez simple. A l’heure actuelle, les bases de données SQL sont stockées au même endroit que les fichiers de log, dans /var.

J’ai besoin de plus d’espace disque pour ces bases SQL. Espace dont je dispose dans /home.
Je dois donc couper le serveur mysql, déplacer toutes les bases et le relancer.
Lorsque j’avais tenté de faire cela l’an dernier, j’avais tout cassé. Je compte ici prendre beaucoup plus de rigueur et ait déjà fait l’essai sur Norris. Il n’y a pas de raison que cela foire.

Je prévois cependant d’avoir quelques soucis. On sait jamais.
La maintenance aura donc lieu au mieux vendredi de 22h à 1-2h du matin (GMT+1). Si je n’ai pas fini à ce moment la, je remets tout en place et je finis le lendemain dans les mêmes horaires.

Inutile donc de visiter ce blog ou RefStats demain (et peut-être samedi) entre 22h et 2h du matin (GMT+1).

Ruby on Rails propose des méthodes « create_table » et une fonctionnalité « db:migrate », qui permetten de créer la base de données de votre application.
Des exemples sur « Migration » sont disponibles avec l’API du framework.

Par défaut, l’outil crée un champ « id », qui est la clé primaire de votre table.
Vous pouvez modifier cela avec les options « id » et « primary_key » lors de l’appel à la fonction create_table.
Ainsi, pour créer une table « test » sans clé primaire, il vous faut faire :

create_table :test, :id => false do |t|
end

Vous pouvez également créer une table avec une clé primaire qui se nommerait « myId »

create_table :test, :primary_key => "myId" do |t|
end

Mais vous pouvez également désirer créer une table avec deux champs comprenant la clé primaire. Vous pouvez essayer de mettre deux champs dans primary_key malheureusement, cela ne fonctionne pas (vraissemblablement car certains SGBDR ne gèrent pas la création de clé primaires constituées de deux champs).

Il va donc falloir tricher. Sachez déjà que notre base ne sera pas en 3e forme normale.

Créeons donc d’abord une table « user_access » avec deux champs : user_id et access_id

create_table :user_access, :id => false do |t|
t.column :user_id, :integer
t.column :access_id, :integer
end

Maintenant il nous faut déclarer nos deux champs comme étant des index.

add_index :user_access, [:user_id, :access_id], :unique

Nous créeons donc un index unique contenant nos deux champs. Nous n’avons pas de clé primaire à proprement parler. Mais le SGBDR traitera la chose de la même manière.

Le code en entier :

class AddUserAccess < ActiveRecord::Migration
def self.up

create_table :user_access, :id => false do |t|
t.column :user_id, :integer
t.column :access_id, :integer
end
add_index :user_access, [:user_id, :access_id], :unique
end
end

 
Fork me on GitHub