Rails - find_by_sql +存储过程

时间:2011-03-11 20:17:43

标签: mysql ruby-on-rails activerecord

我正在尝试使用我创建的存储过程从MySQL数据库中获取对象。

@locs = Location.find_by_sql("CALL geodist(100.4058, 37.7907, 10000, 'Sample')")

这会导致以下错误

Location Load (6.4ms)  CALL geodist(100.4058, 37.7907, 10000, 'Sample')
Completed   in 37ms

Mysql2::Error (Commands out of sync; you can't run this command now):

以下情况可行:

@locations = Location.connection.select_all("CALL geodist(100.4058, 37.7907, 10000, 'Sample')")

但是,它不返回对象,只返回值的哈希值。

有没有办法让find_by_sql工作?如果没有,如何在不再次查询数据库的情况下手动实例化AR模型?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过将每个哈希发送到活动记录模型的构造函数来自己构建对象

@locations = Location.connection.select_all("CALL geodist(100.4058, 37.7907, 10000, 'Sample')")
results = Array.new
@locations.each do |location|
  results[] = Location.new(location)
end

UPD: 顺便说一下它的奇怪行为我只是看着find_by_sql方法实现它看起来很熟悉 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-find_by_sql