【问题标题】:Can RoR deal with char(1) fields as "boolean" fields?RoR 可以将 char(1) 字段作为“布尔”字段处理吗?
【发布时间】:2010-10-05 23:41:50
【问题描述】:

我正在考虑将 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) 作为是/否值。

【问题讨论】:

    标签: sql ruby-on-rails types


    【解决方案1】:

    你不能用视图或存储过程将它包装在你的数据库引擎中,以便为你的应用程序生成一个一致的接口吗?

    【讨论】:

    • Rails 中确实没有使用 ActiveRecord。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      class Product < ActiveRecord::Base
      
        yes_no_accessor :recycled
      
      end
      

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

      【讨论】:

      • 我想知道如果我有数据库级别的约束以确保它始终是 Y/N,我的方法是否可行;我不介意添加“自定义”回收?检查值的方法;迁移(如果我使用它们)会将它作为一个限制为 1 的字符串,只是我想要访问它的好方法
      • 您的方式肯定会奏效,但您每次都必须定义自定义访问器。如果你有很多这样的专栏,我的建议都是为了让事情变得更容易,但也许这是不必要的。
      猜你喜欢
      • 2014-08-27
      • 2010-10-06
      • 2021-09-07
      • 2012-07-19
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2016-02-07
      • 2012-04-01
      相关资源
      最近更新 更多