在Rails中,基于ActiveRecord的查询为Postgres和其他数据库类型返回不同的集合

时间:2017-08-21 19:17:22

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

这是使用带有Rails和ActiveRecord 5.1的Ruby 2.3.3

以此查询为例。

    Quizz
    .select('questions.id as qID, questions.text as qTEXT, answers.id as aID, answers.text as aTEXT')
    .joins(:questions => :answers)
    .where(id: quizz_id)

在针对 SQLite 数据库进行测试时,在开发环境中,它会正确返回包含我选择的字段的哈希集合。

在针对 Postgres 数据库进行测试时,在生产环境中,它错误地返回仅包含字段id Quizz 对象的集合为Nil

需要注意的一些重要事项:

  • 两种情况下的输出查询完全相同。
  • 我已经在Postgres数据库中直接测试了生成的查询(使用to_sql),它运行正常。实际上,如果我使用Postgres数据库运行ActiveRecord::Base.connection.select_all(query.to_sql),结果会按预期结束。

我已经搜索过,找不到它的行为方式不同的原因。

解决方案编辑:

我无法回答这个问题,因为它被标记为重复。事实证明,根据这个link,Postgres将自动小写任何未引用的字段。所以对Postgres的正确查询是:

    Quizz
    .select('questions.id as "qID", questions.text as "qTEXT", answers.id as "aID", answers.text as "aTEXT"')
    .joins(:questions => :answers)
    .where(id: quizz_id)

另外,正如@muisshort在评论部分中指出的那样,inspect不会显示那些字段,但它们就在那里。

0 个答案:

没有答案