更复杂的续集选择

时间:2010-07-12 21:44:45

标签: ruby sequel

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]

......不行。是否有可能以其他方式做到这一点?怎么样?

2 个答案:

答案 0 :(得分:2)

bjg是对的。根据您的具体情况,而不是:

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

你可以尝试:

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

如果您的数据库支持SQL标准提取功能(并非所有数据库都支持),哪个应该有效。如果您的数据库没有,您将不得不调用您的数据库存在的任何类似函数。

答案 1 :(得分:1)

我想你在这里问了两个不同的问题:

  1. 在关系数据库中存储日期等丰富对象是绝对正常的(大多数(如果不是所有支持日期等)都是如此)。 Sequel的DateTime属性类型承认了这一事实,并提供了对其所有支持的后端的抽象。

  2. 过滤不太明显。不同的后端(读取数据库实现)将提供非常不同的分解方法,从而选择这些对象的一部分。像Sequel这样的ORM必须绘制一些抽象线,它(通常)通常适用于所有支持的后端。在某些情况下(DateTime可能就是其中之一),通过ORM的语法糖将无法获得更复杂的过滤。在这种情况下,您可能需要下拉到每个数据库的SQL工具来实现您想要的,或者至少在形成语法糖解决方案时要注意底层语义