【发布时间】:2013-12-07 13:51:17
【问题描述】:
我有模型 Client 和 Sessions 以及一个连接模型 ClientSessionAssignment 将两者关联起来。 ClientSessionAssignment 有一个连接列score,定义为decimal,输入schema.rb。在查询Client 的实例时,我使用has_many 和select 预加载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