2010-07-12 7 views
1

Il y a une base de données simple Sequel:Sequel Plus compliquées sélections

DB = Sequel.sqlite 

DB.create_table :items do 
    primary_key :id 
    DateTime :date 
    String :name 
end 

items = DB[:items] 
items.insert(:name => 'abc', :date => DateTime.now) 
items.insert(:name => 'ghi', :date => DateTime.now) 
items.insert(:name => 'def', :date => DateTime.now) 

La question: est-ce une bonne idée de stocker des objets « étranges » dans la base de données, comme DateTime?

puts items.first(:name => 'ghi')[:date].year 

Sortie '2010' donc, bien - cela fonctionne. Mais encore je suis assez curieux à ce sujet. Si ce n'est pas mauvais, qu'en est-il du filtrage? Des choses comme ça:

puts items.first(:date.year => 2010)[:name] 

... ne fonctionnera pas. Est-il possible de le faire autrement? Comment?

Répondre

1

Je pense que vous vous posez 2 questions différentes ici:

  1. Il est tout à fait normal de stocker des objets riches comme les dates dans les bases de données relationnelles (la plupart, sinon toutes les dates de soutien, etc.). Le type d'attribut DateTime de Sequel reconnaît ce fait et fournit une abstraction sur tous ses back-end pris en charge.

  2. Le filtrage est moins évident. Différents back-ends (lire implémentations de base de données) fourniront des façons très différentes de décomposer et donc de sélectionner des parties de ces objets. Un ORM comme Sequel doit dessiner une ligne d'abstraction qui est (espérons-le) communément applicable à tous les back-end supportés. Dans certains cas (et DateTime peut être l'un d'entre eux) le filtrage plus sophistiqué ne sera pas disponible via le sucre syntaxique de l'ORM. Vous pouvez, dans ce cas, besoin de descendre à la par base de données installation SQL pour obtenir ce que vous voulez, ou à tout le moins, être au courant de la sémantique sous-jacente lors de la formation de votre solution de sucre syntaxique

2

de bjg est correct. Pour votre situation particulière, au lieu de:

puts items.first(:date.year => 2010)[:name] 

Vous pouvez essayer:

puts items.first(:date.extract(:year) => 2010)[:name] 

qui devrait fonctionner si votre base de données prend en charge la fonction d'extraction standard SQL (pas toutes les bases de données ne). Si votre base de données ne fonctionne pas, vous devrez appeler votre fonction similaire pour votre base de données.

Questions connexes