我正在考虑将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)作为是/否值不是我过去使用过的东西。
答案 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)
您是否可以使用视图或存储过程将其包装在数据库引擎中,以便为您的应用程序生成一致的界面?