Более сложные варианты продолжения - PullRequest
1 голос
/ 13 июля 2010

В сиквеле есть простая база данных:

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 ]

2 голосов
/ 19 июля 2010

BJG правильно. Для вашей конкретной ситуации вместо:

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

Вы можете попробовать:

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

Что должно работать, если ваша база данных поддерживает стандартную функцию извлечения SQL (не все базы данных поддерживают). Если вашей базы данных нет, вам придется вызывать вашу аналогичную функцию, существующую для вашей базы данных.

1 голос
/ 13 июля 2010

Я думаю, что вы задаете 2 разных вопроса здесь:

  1. Абсолютно нормально хранить расширенные объекты, такие как даты, в реляционных базах данных (большинство, если не все даты поддержки и тому подобное). Тип атрибута Sequel DateTime подтверждает этот факт и обеспечивает абстракцию для всех поддерживаемых серверных частей.

  2. Фильтрация менее очевидна. Различные бэкэнды (читай реализации базы данных ) обеспечат очень разные способы декомпозиции и, следовательно, выбора частей этих объектов. ORM, такой как Sequel, должен нарисовать некоторую линию абстракции, которая (надеюсь) обычно применима ко всем поддерживаемым серверам. В некоторых случаях (и DateTime вполне может быть одним из них) более сложная фильтрация не будет доступна через синтаксический сахар ORM. В таких случаях вам может потребоваться перейти к средству SQL для каждой базы данных, чтобы достичь того, чего вы хотите, или, по крайней мере, знать о базовой семантике при формировании синтаксического сахарного решения

...