如何从Arel输出中获取数据并转换为可用记录?
把Arel输出转成可访问的Rails记录
别急,Arel本身只是帮你构造SQL查询的工具,它输出的是查询构造器对象,不是直接的记录集合,咱们一步步把它转成能用的数据:
1. 转成ActiveRecord关系对象(最推荐)
这是最贴合Rails用法的方式,把Arel查询传给模型的where方法,就能得到熟悉的ActiveRecord::Relation,和你平时用User.where(age: 18)得到的对象完全一样,支持所有常用的链式方法(all、first、each等)。
举个实际例子:
# 先定义Arel表对象 users_table = User.arel_table # 构造Arel查询条件 arel_condition = users_table[:age].gt(18).and(users_table[:active].eq(true)) # 转成ActiveRecord关系 @filtered_users = User.where(arel_condition) # 现在就能正常访问记录了 @filtered_users.each do |user| puts user.name # 直接调用模型属性 end
2. 直接执行查询获取哈希数组
如果你用Arel写了完整的project(即select)语句,也可以直接通过数据库连接执行查询,得到哈希格式的记录数组:
# 构造包含指定字段的Arel查询 arel_query = users_table.project(users_table[:id], users_table[:name]) .where(users_table[:created_at].gt(1.week.ago)) # 执行查询并转成哈希数组 user_records = ActiveRecord::Base.connection.select_all(arel_query).to_a # 访问方式是哈希键取值 puts user_records.first['name']
3. 控制台调试小技巧
在控制台里可以先打印Arel生成的SQL,确认查询逻辑没问题:
puts arel_query.to_sql # 会输出对应的SQL语句,比如:SELECT "users"."id", "users"."name" FROM "users" WHERE "users"."created_at" > '2024-05-20'
4. 在Rails视图中使用
- 如果是转成了
ActiveRecord::Relation,直接像普通模型集合一样遍历:
<% @filtered_users.each do |user| %> <div>用户名:<%= user.name %>,年龄:<%= user.age %></div> <% end %>
- 如果是哈希数组,就用哈希键来访问字段:
<% user_records.each do |user| %> <div>用户名:<%= user['name'] %>,ID:<%= user['id'] %></div> <% end %>
内容的提问来源于stack exchange,提问作者stevec
相关产品推荐
相关产品推荐

