【问题标题】:Rails: Why is my boolean field returning Fixnum?Rails:为什么我的布尔字段返回 Fixnum?
【发布时间】:2011-12-15 07:45:25
【问题描述】:

我们的系统中有一个布尔字段(使用 Rails 3.0.4),当附加到 MySQL 时,字段会根据需要报告 true 和 false。当附加到 Oracle(生产)时,它返回 Fixnum。该列的类型为 NUMBER(1)。其他模型正确返回 true 和 false。控制器正在做一个简单的查找。这只发生在表演动作上。索引返回真假。 HTML 和 XML 响应都会发生这种情况。当询问字段的类型时,控制台会报告 FalseClass 或 TrueClass 类。 View 报告 Fixnum。

可能出了什么问题?

更新:代码

create_table "people", :force => true do |t|
  t.string   "name"
  t.boolean  "has_information"
end

class Person < ActiveRecord::Base
  has_many :groups
end

更新了更清晰的问题

Rails 约定是将字段设为 NUMBER(1) 类型的列。然后将其转换为模型中的布尔值。这在我们的应用程序的几个模型中工作。只有一个模型有这个问题。它只在表演动作上有问题。 show 动作是由脚手架创建的,因此非常通用。为什么 Rails 在这一实例中不遵循约定?

已更新解决方案

在这个实例中通过调用 Person.find_by_id!(params[:id]) 而不是 Person.find(params[:id]) 来修复它为什么默认在正常查找中为字段返回错误的类是超越我。

【问题讨论】:

  • 向我们展示您的模型代码和 schema.rb 文件
  • 这个我不确定,但是我认为Rails默认不支持Oracle?你用的是什么适配器?
  • OracleAdapter。绝对支持 Oracle。不太好,但支持。
  • 具体来说:activerecord-oracle_enhanced-adapter 和 ruby​​-oci8

标签: ruby-on-rails oracle activerecord


【解决方案1】:

从视图返回的复选框将是一个数字,“0”或“1”取决于复选框是未选中还是选中。如果您的数据库适配器需要它,您需要在模型中将其转换为 falsetrue 值。

【讨论】:

  • 这与表格无关。一切正常。问题在于表演动作。 Rails 出于某种原因决定此模型上的此字段不是布尔值。
【解决方案2】:

Oracle 中没有 BOOLEAN 类型。我们通常使用 CHAR(1) 字段,其值被限制为“Y”和“N”。 YMMV。

分享和享受。

【讨论】:

  • Rails 约定是将字段设为 NUMBER(1) 类型的列。然后将其转换为模型中的布尔值。这适用于我们应用程序的多个模型。只有一个模型有这个问题。它只在表演动作上有问题。 show 动作是由脚手架创建的,因此非常通用。为什么 Rails 在这一实例中不遵循约定?
【解决方案3】:

答案是更新 Oracle 适配器,因为它已过时。 1.3.0 版的 activerecord-oracle_enhanced-adapter gem 报告了一个错误:

https://github.com/rsim/oracle-enhanced/issues/7

我们更新了驱动程序,现在一切正常。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2013-09-02
    • 2012-08-26
    • 2017-08-27
    • 2020-03-21
    • 2015-02-18
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多