【发布时间】:2013-06-14 19:40:35
【问题描述】:
我有一个带有几个资源的 Rails 应用程序,我需要在这些资源上运行涉及按位运算的查询。现在,我正在使用 PostgreSQL,并为我的“用户”模型创建了一个迁移,该模型使用 postgres 特定的“BIT VARYING”数据类型,因为这是在 postgres 网站上推荐的按位“&”操作:
add_column :users, :timeslots, :'BIT VARYING'
在我的一个查询中,我以这种方式使用“&”:
self.where("available_lbs > 0 AND status = 0 AND ? & timeslot > 0::bit AND available_end >= ?", user.timeslots, Time.now)
这似乎在我的机器上工作,但有两个问题:
- 数据类型和查询都是特定于数据库的,所以如果我迁移到另一个数据库,我可能需要进行更改
- 此迁移似乎没有正确更新 schema.rb 文件。在描述如何创建表时,它仍然使用 Rails 'string' 数据类型:
create_table "users", :force => true do |t|
t.string "timeslots", :limit => nil
结束
因此,当我在新机器上设置应用程序时,它使用了错误的数据类型,事情就中断了。对此有什么好的解决方案吗? (我尝试使用“二进制”数据类型,但这似乎不适用于 postgres)
【问题讨论】:
-
这篇文章有一些关于数学的很好的信息,但它没有说任何关于处理数据库方面的内容。
-
为什么在关系数据库中使用位运算符?这通常是一件令人讨厌的事情,您的数据库可能会因此而讨厌您。
-
我正在尝试查找与我传入的另一个时隙字段的时隙字段的 & 为 > 0 的所有用户记录。我认为在查询中执行此操作比将它们全部拉入 Ruby 并在那里执行。
-
但是为什么
timeslot是位图呢?为什么不使用对关系数据库更自然的表示?位图在 C 语言中是有意义的,但在其他任何地方它们几乎总是过早的优化。
标签: sql ruby-on-rails-3 postgresql bit-manipulation bit-masks