1

Sequel には単純なデータベースがあります。

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)

質問: DateTime のような「奇妙な」オブジェクトをデータベースに保存するのは良い考えですか?

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

「2010」を出力するので、うまくいきます。しかし、それでも私はそれについて非常に興味があります。問題がなければ、フィルタリングはどうでしょうか。そういうもの:

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

...うまくいきません。他の方法でそれを行うことは可能ですか?どのように?

4

2 に答える 2

2

bjgは正しいです。特定の状況では、次の代わりに:

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

あなたは試すことができます:

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

データベースが SQL 標準の抽出機能をサポートしている場合、これは機能するはずです (すべてのデータベースがサポートしているわけではありません)。データベースがそうでない場合は、データベースに存在する同様の関数を呼び出す必要があります。

于 2010-07-19T16:13:51.033 に答える
1

ここで2つの異なる質問をしていると思います:

  1. 日付などのリッチ オブジェクトをリレーショナル データベースに格納することは、まったく普通のことです (すべてではないにしてもほとんどが日付などをサポートしています)。Sequel のDateTime属性タイプはこの事実を認識しており、サポートされているすべてのバックエンドを抽象化しています。

  2. フィルタリングはそれほど明白ではありません。さまざまなバックエンド (読み取りデータベースの実装) は、これらのオブジェクトの一部を分解して選択するための非常にさまざまな方法を提供します。Sequel のような ORM は、サポートされているすべてのバックエンドに (できれば) 一般的に適用できる抽象化の線を引く必要があります。場合によっては (そしてDateTimeその 1 つかもしれません)、ORM のシンタックス シュガーを介してより洗練されたフィルタリングを利用できない場合があります。このような場合、目的を達成するためにデータベースごとの SQL 機能にドロップダウンする必要があるかもしれません。または、少なくとも、シンタックス シュガー ソリューションを形成する際に、基礎となるセマンティクスを認識しておく必要があります。

于 2010-07-13T00:35:57.713 に答える