将SQL结果转换为ActiveRecord关系

4
在接下来的内容中,
@records = ActiveRecord::Base.connection.exec_query(sql)

"sql"字符串是调用返回表格的数据库函数。 这行代码返回#<ActiveRecord::Result:0x007fd90ba87460 @columns=["zip_code", "county", ..], @rows=[[94121, "San Francisco", ..], [94110, "San Francisco", ..], ..]

我该怎么做才能使@records成为一个ActiveRecord关系,以便我可以使用典型的关系方法/语法,例如

@records.each do |r| r.county, r.zip_code end
1个回答

2

这个类封装了从任何数据库连接适配器调用exec_query返回的结果。例如:

sql = 'SELECT id, zip_code, county FROM records'
@records = ActiveRecord::Base.connection.exec_query(sql)
# Get the column names of the result:
@records.columns
# => ["id", "zip_code", "county"]

# Get the record values of the result:
@records.rows
# => [[1, "94121", "San Francisco"],
      [2, "94110", "San Francisco"],
      ...
     ]

# Get an array of hashes representing the result (column => value):
@records.to_hash
# => [{"id" => 1, "zip_code" => "94121", "county" => "San Francisco"},
      {"id" => 2, "zip_code" => "94110", "county" => "San Francisco"},
      ...
     ]

# ActiveRecord::Result also includes Enumerable.
@records.each do |row|
  puts row['zip_code'] + " " + row['county']
end

非常好的答案,谢谢!在我的预问题研究中,我发现了find_by_sql,但没有意识到它可以这样使用。 - Tim Koelkebeck
它适合作者的需求,因为他们只想使用适用于数组的 each 方法,但我对获取 ARRelation 感兴趣,这样我就可以使用 where 方法,这有点类似于他们所要求的。 "我该怎么做才能让 @records 成为 ActiveRecord 关系,以便我可以使用典型的关系方法?" - ryan2johnson9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接