我有一个 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_sql和 to_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/