在进行数据库查询时,我在检索虚拟属性时遇到问题。以下工作符合预期:

s = Story.includes(:scenes).select("stories.*, 3 as testval")
s.first.title
=> "My Story"
s.first.testval
=> 3

但当我加入where子句时,它就停止工作了:
s = Story.includes(:scenes).select("stories.*, 3 as testval").where("scenes.id < ?",1000).references(:scenes)
s.first.title
=> "My Story"
s.first.testval
NoMethodError: undefined method `testval' for #<Story:0x007fcd6b93eb68>

我猜问题是activerecord不知道“testval”应该属于“stories”而不是“scenes”,但我不确定。有人知道怎么解决这个问题吗?

最佳答案

很抱歉给您带来坏消息,但是您不能自定义select和eager load,因为references/eager_load会用一堆t%d_r%d覆盖select。
如果需要虚拟属性,则需要使用不同的ActiveRecord策略进行处理。

10-01 13:13