【问题标题】:Data type of attribute on join model in Active Record/Rails 3.2/PostgreSQL databaseActive Record/Rails 3.2/PostgreSQL 数据库中连接模型属性的数据类型
【发布时间】:2013-12-07 13:51:17
【问题描述】:

我有模型 ClientSessions 以及一个连接模型 ClientSessionAssignment 将两者关联起来。 ClientSessionAssignment 有一个连接列score,定义为decimal,输入schema.rb。在查询Client 的实例时,我使用has_manyselect 预加载score 值,如下所示:

class Client < ActiveRecord::Base
  has_many :sessions,
    :through => :client_session_assignments,
    :select => 'sessions.*, client_session_assignments.score'
end

尽管score在数据库中被定义为decimal,当以这种方式访问​​它时,Active Record将它表示为一个字符串,即Client.first.sessions.first.score.class产生String,而我希望它产生BigDecimal .因此,我必须将通过这种方式获得的分数转换或转换为BigDecimal,然后才能对其进行任何计算。

更新

事实证明,只有 postgresql 数据库适配器表现出这种奇怪的行为。我已提交 https://github.com/rails/rails/issues/13044 以在 GitHub 上的 Rails 错误跟踪器中跟踪此问题:完整的测试用例位于 https://gist.github.com/rcook/7670071

【问题讨论】:

  • 删除关联声明中的 :select 选项并再次运行 Client.first.sessions.first.score.class 时的输出是什么?
  • 如果没有:select 选项,则score 不会添加到Client.first.sessions.first
  • 哦,对了。试试这个:Client.first.client_session_assignments.first.score.class
  • 返回BigDecimal
  • 您使用的是什么数据库?你可以在声明十进制列的模式中发布代码吗?你可以在github中发布任何示例应用程序吗,因为我尝试使用rails 3.2.13和mysql db,它工作正常(返回BigDecimal通过关联调用)

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord


【解决方案1】:

似乎 activerecord 没有通过关联正确地进行类型转换。尝试覆盖连接模型中的访问器方法:

class ClientSessionAssignment < ActiveRecord::Base
  def score
    ActiveRecord::ConnectionAdapters::Column.value_to_decimal super
  end
end

当您调用 Client.first.sessions.first.score 时,这应该返回一个 BigDecimal

【讨论】:

  • 今晚我试试。这看起来可以解决这种行为。你知道这是否是 Active Record 中的错误吗?
  • 刚从你的问题中得知,可能是。
【解决方案2】:

这是 Rails 3.2.x 中的一个错误:

https://github.com/rails/rails/issues/13044

它已在 Rails 4.0.1 中修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多