2010-07-12 61 views
1

有續集中一個簡單的數據庫:更復雜的續集選擇

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] 

...將無法正常工作。有可能以其他方式做到嗎?怎麼樣?

回答

1

我想你問的2個不同的問題在這裏:

  1. 這是絕對正常的存儲像在關係數據庫中的日期豐富的對象(如果不是所有支持日期等)。續集的DateTime屬性類型正在承認這一事實,並提供對其所有支持的後端的抽象。

  2. 過濾不太明顯。不同的後端(讀取數據庫實現)將提供非常不同的分解方式,從而選擇這些對象的一部分。象Sequel這樣的ORM必須畫出一些抽象線,這種抽象線有希望普遍適用於所有支持的後端。在某些情況下(並且DateTime可能就是其中之一),更復雜的過濾將無法通過ORM的語法糖來獲得。您可能,在這種情況下,需要下降到了每個數據庫的SQL工具來實現你想要的,或者至少是,形成你的語法糖溶液

2

BJG時要注意的基本語義是正確的。爲了您的具體情況,而不是,:

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

你可以嘗試:

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

如果你的數據庫支持SQL標準提取功能(不是所有的數據庫做)這應該工作。如果你的數據庫沒有,你必須調用你的數據庫存在的任何類似的函數。