RoR可以将char(1)字段作为“布尔”字段处理吗?

时间:2009-02-06 16:57:19

标签: sql ruby-on-rails types

我正在考虑将Ruby on Rails用于必须利用现有数据的店面,但如果需要,我可以创建自己的数据库架构。现有数据中的许多字段都是char(1),用于模拟布尔字段(即Y / N),我认为,这是跨平台的可移植性。由于数据容易发生变化,我不想更改现有结构并将这些字段转换为位/布尔字段。

如果我确实使用Rails,我真的想利用Ruby的漂亮布尔语法并说出类似<%= image_tag 'recycled.jpg' if product.recycled? %>的内容,但是Rails会将char(1)识别为布尔值,或者我是否必须定义这些方法我自己在模特中:

class Product < ActiveRecord::Base
  # ... other stuff here
  def recycled?
    self.recycled == 'Y'
  end
end

我想我必须自己重新定义它们,这没什么大不了的,我只是想确保使用char(1)作为是/否值不是我过去使用过的东西。

3 个答案:

答案 0 :(得分:1)

我可能会在模型级别攻击它 - 当你将一行加载到模型实例中时,根据char计算一个布尔属性。为返回此值的虚拟属性添加一个getter,以及一个更新boolean和底层char的setter。

答案 1 :(得分:1)

据我所知,ActiveRecord开箱即用,您所描述的内容无法实现。

但是,如果您有很多这样的列,您可以考虑进行一些元编程,以提供添加相关访问器逻辑的声明方式。类似的东西: -

class Product < ActiveRecord::Base

  yes_no_accessor :recycled

end

另一种可能性是猴子补丁ActiveRecord。我认为相关方法是ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)。您可以尝试覆盖ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES常量以包含'Y'。我还没有尝试过这个!

答案 2 :(得分:-1)

您是否可以使用视图或存储过程将其包装在数据库引擎中,以便为您的应用程序生成一致的界面?