Rails:与数据库无关的数据类型,适用于按位运算

时间:2013-06-14 19:40:36

标签: sql ruby-on-rails-3 postgresql bit-manipulation bit-masks

我有一个带有几个资源的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)

这似乎适用于我的机器,但有两个问题:

  1. 数据类型和查询都是特定于数据库的,所以如果我迁移到另一个数据库,我可能不得不改变一些事情
  2. 此迁移似乎没有正确更新schema.rb文件。在描述如何创建表时,它仍然使用Rails'字符串'数据类型:
  3.   

    create_table“users”,:force =>真的做| t |

         

    t.string“timeslots”,:limit =>零

         

    因此,当我在新机器上设置应用程序时,它使用了错误的数据类型并且事情中断了。有什么好的解决方案吗? (我尝试使用'binary'数据类型,但这似乎不适用于postgres)

1 个答案:

答案 0 :(得分:1)

我建议规范化数据模型:用户---一对多--->时隙。

这是可移植的,您可以使用所有更高级别的SQL函数,如窗口聚合等。

此外,您的记录是“人类可读的”,例如在即席查询中,因为它们不需要逐位操作。

如果选择位字段,通常会以性能为代价优化大小/内存使用量。我从未见过有关PostgreSQL的比较,但在微处理器/微控制器的汇编级别就是这种情况:即使在内存受限的微控制器中,通常选择bool(需要一个字节,如果对齐可能为四个)因为访问速度更快,所以需要更少的指令。而且编码和调试也更容易。