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]
......不行。是否有可能以其他方式做到这一点?怎么样?
答案 0 :(得分:2)
bjg是对的。根据您的具体情况,而不是:
puts items.first(:date.year => 2010)[:name]
你可以尝试:
puts items.first(:date.extract(:year) => 2010)[:name]
如果您的数据库支持SQL标准提取功能(并非所有数据库都支持),哪个应该有效。如果您的数据库没有,您将不得不调用您的数据库存在的任何类似函数。
答案 1 :(得分:1)
我想你在这里问了两个不同的问题:
在关系数据库中存储日期等丰富对象是绝对正常的(大多数(如果不是所有支持日期等)都是如此)。 Sequel的DateTime
属性类型承认了这一事实,并提供了对其所有支持的后端的抽象。
过滤不太明显。不同的后端(读取数据库实现)将提供非常不同的分解方法,从而选择这些对象的一部分。像Sequel这样的ORM必须绘制一些抽象线,它(通常)通常适用于所有支持的后端。在某些情况下(DateTime
可能就是其中之一),通过ORM的语法糖将无法获得更复杂的过滤。在这种情况下,您可能需要下拉到每个数据库的SQL工具来实现您想要的,或者至少在形成语法糖解决方案时要注意底层语义