【问题标题】:Rails: read integer from tinyintRails:从 tinyint 读取整数
【发布时间】:2012-08-30 13:08:03
【问题描述】:

我有一个 RoR + MySQL 设置。在数据库中有一个 Tinyint 字段t。当我从 Rails 读取 t 的值时,我得到 truefalse,因为 Rails 将 Tinyint 字段解释为布尔值。到现在为止还挺好。

如何将这个字段 t 从 Rails 中读取为实际整数?

【问题讨论】:

  • 请将您用来读取的代码显示为布尔值;我很惊讶您不能以相同的方式将其读取为整数(毕竟,它是一个 1 字节的整数列)。我不知道 Ruby 中是否有更好的方法,但最坏的情况是您可以尝试SELECT CONVERT(tinyintcolumn, [UN]SIGNED) FROM my_table?
  • 我只是使用标准的 Model.find_by_id() 来获取记录。

标签: mysql ruby-on-rails ruby database ruby-on-rails-3


【解决方案1】:

http://apidock.com/rails/ActiveRecord/AttributeMethods/BeforeTypeCast/attributes_before_type_cast

例如:

Model.first.attributes_before_type_cast['your_boolean_field']

这取决于您的数据库将返回什么值,在 postgesql 中它是 'f' 或 't'

【讨论】:

  • 如果只需要一个字段,也可以使用read_attribute_before_type_cast('your_boolean_field')甚至your_boolean_field_before_type_cast的方法。
  • read_attribute_before_type_cast 对我不起作用。 Here,你可以看看我是怎么解决的。
【解决方案2】:

基于@sumskyi 的响应,如果您始终将此字段作为常规整数访问,您可以重写模型的内置方法并避免重复运动伤害:

class GroceryStore < ActiveRecord::Base
  # rating is a TINYINT column
  # we just redefine the method here to return the value cast how we want it
  def rating
    self.attributes_before_type_cast['rating'].to_i
  end
end

现在,如果您调用 grocerystore.rating,您将得到一个整数而不是布尔值。

【讨论】:

  • 找到了一些更有用的信息here:您可以通过在config/application.rb 中设置ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans = false 来完全禁用布尔解释。但是,他们没有提到您还必须在 application.rb 中明确要求 active_record/connection_adapters/mysql2_adapter,因此请确保不要错过!见this post
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多