ruby-on-rails - 如何从 Rails connection.execute 转换数据类型

标签 ruby-on-rails activerecord arel

我有一个 AREL 查询,是我费尽心思生成的。仅供引用(抱歉):

def self.summarize_user(user)
  c   = Arel::Table.new(:categories)
  s   = Arel::Table.new(:skills)
  cp  = Arel::Table.new(:completions)

  query = c.project(c[:id], c[:name], c[:handle])
    .project(s[:id].count.as("total_skills"))
    .project(cp[:id].count.as("total_completed"))
    .project(cp[:verified_on].count.as("total_verified"))
    .join(s).on(s[:category_id].eq c[:id])
    .join(cp, Arel::Nodes::OuterJoin).on(cp[:skill_id].eq s[:id])
    .where(cp[:user_id].eq(user.id).or(cp[:user_id].eq nil))
    .group(c[:id], c[:name], c[:handle])

  # this is the relevant bit
  connection.execute(query.to_sql)
end

这会执行并从数据库中给出正确的结果,如下所示:

{ "id" => "13",
  "name" => "Category 16",
  "handle" => "category_16",
  "total_skills" => "4",
  "total_completed" => "0",
  "total_verified" => "0"
}

因此,鉴于该方法已经是一个怪物,我宁愿不尝试 .inject 通过结果将所有数字转换为 Fixnum。使用connection.execute时,有没有办法将字段转换为正确的数据类型?

最佳答案

您可以利用find_by_sqlto_json

json_records = Arel::Table.find_by_sql(query.to_sql).to_json

然后您可以提取结果,例如

result = JSON.parse json_records

有多种方法可以将ActiveRecord 对象转换为hash。这只是我个人的喜好。

关于ruby-on-rails - 如何从 Rails connection.execute 转换数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331878/

相关文章:

jquery - 如何将 json 响应从 Controller 发送到 jQuery 并检查它?

ruby - Rails 3 db :migrate 的未定义方法 `visitor'

ruby-on-rails - 可以查询 Rails 中缓存的条目集合吗?

mysql - Ruby on Rails 表名 : what's permitted?

ruby-on-rails - 使用事件记录搜索序列化数据

ruby-on-rails - rails 3 : scope is not true

mysql - 如果不存在重复项,如何执行选择?

ruby-on-rails - 使用 Capybara 和 Rspec 进行功能测试 - 单击按钮不会重定向到正确的路线

ruby-on-rails - 我们可以从 View 调用 Controller 的方法吗(理想情况下我们从 helper 调用)?

ruby-on-rails - 如何使用 ActionController::TestCase#post 使用具有 http 基本身份验证的 Rest API?