Ruby 更复杂的续集选择

Ruby 更复杂的续集选择,ruby,sequel,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 => Date

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]

。。。不行。有没有可能用另一种方式呢?怎么做?

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

  • 在关系数据库中存储诸如日期之类的丰富对象是绝对正常的(大多数(如果不是全部的话)都支持日期之类的内容。Sequel的
    DateTime
    属性类型承认了这一事实,并在其所有受支持的后端上提供了一个抽象

  • 过滤不太明显。不同的后端(读取数据库实现)将提供非常不同的分解方法,从而选择这些对象的部分。类似ORM的续集必须画出一些抽象线,这些抽象线(希望)通常适用于所有受支持的后端。在某些情况下(并且
    DateTime
    很可能是其中之一),ORM的语法糖无法提供更复杂的过滤。在这种情况下,您可能需要下拉到每数据库SQL工具来实现您想要的功能,或者至少在形成语法糖解决方案时要注意底层语义


  • bjg是正确的。针对您的具体情况,而不是:

    puts items.first(:date.year => 2010)[:name]
    
    你可以试试:

    puts items.first(:date.extract(:year) => 2010)[:name]
    
    如果您的数据库支持SQL标准提取功能(并非所有数据库都支持),则该功能应该可以工作。如果数据库没有,则必须调用数据库中存在的任何类似函数