Ruby on rails RubyonRails脚本/控制台打印超出预期
我在RubyonRails应用程序中有一个简单的模型设置。(User{name,username,lat,lon}),我正在为模型编写一个基本扩展。我希望该方法返回一定距离内的用户。在页面视图中一切正常,但在调试过程中,我希望使用脚本/控制台完成一些测试 我的问题:当我从命令行和脚本/控制台运行它时,它似乎正在将整个结果集打印到屏幕上 我的模型:Ruby on rails RubyonRails脚本/控制台打印超出预期,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我在RubyonRails应用程序中有一个简单的模型设置。(User{name,username,lat,lon}),我正在为模型编写一个基本扩展。我希望该方法返回一定距离内的用户。在页面视图中一切正常,但在调试过程中,我希望使用脚本/控制台完成一些测试 我的问题:当我从命令行和脚本/控制台运行它时,它似乎正在将整个结果集打印到屏幕上 我的模型: class User < ActiveRecord::Base def distance_from(aLat, aLon) Mat
class User < ActiveRecord::Base
def distance_from(aLat, aLon)
Math.sqrt((69.1*(aLat - self.lat))**2 + (49*(aLon - self.lon))**2 )
end
def distance_from_user(aUser)
distance_from(aUser.lat, aUser.lon)
end
def users_within(distance)
close_users = []
users = User.find(:all)
users.each do |u|
close_users << u if u.distance_from_user(self) < distance
end
return close_users
end
end
因此,我想知道它为什么要打印整个结果集,以及是否有办法抑制它,以便只打印我想要的内容?您应该使用mysql查询来处理它。 从数据库中提取所有数据并显示其中的前10个数据是不好的做法。 做一些如下的事情
User.find_by_sql("select u.*,
(((69.1*(aLat - self.lat))**2 + (49*(aLon - self.lon))**2 ) < 100")) as distance
from users u
where u.username='someuser' and
distance > 100 order by distance DESC LIMIT 10)
User.by_sql查找_(“选择u.*,
(((69.1*(aLat-self.lat))**2+(49*(aLon-self.lon))**2)<100”)作为距离
来自用户u
其中u.username='someuser'和
距离>100按距离顺序描述限制10)
上面的查询只是一个示例,但执行上面的操作始终是一个很好的实践。Ruby应用程序的控制台界面似乎会对每一行进行评估,就好像它是从控制台输入的一样 我本来希望它能对脚本进行一些封装,但这是有意义的,因为它是由ruby交互控制台行动态解释的 为了澄清首选的sql基础解决方案,在我找到的大多数参考资料中,都不赞成按sql查找。我推荐的基于SQL的解决方案是
def f
User.find(:all, :conditions => ["sqrt(pow(69.1*(lat - ?),2) + pow(49*(lon - ?),2)) < 1", lat.to_s,lon.to_s])
end
def
User.find(:all,:conditions=>[“sqrt(pow(69.1*(lat-?),2)+pow(49*(lon-?),2))<1”,lat.to_s,lon.to_s])
结束
好吧,我想要一份大约10个用户的打印件,他们在一英里之内。不是数据库中的1000个用户。我觉得很奇怪。您确定用户“someuser”设置了lat
和lon
字段吗?也许你可以试着看看当你做这样的事情时发生了什么:u.User.find_by_username(“someuser”);v=User.find(200);v、 与用户的距离(u)代码>。正如@Salil所建议的,按照你提议的方式做是个坏主意。即使您不会编写单个查询来获取您感兴趣的所有记录,也最好使用find_in_batches
而不是find。all
是的,我知道这不是最优化的方法,我将此作为一个示例来教授Ruby on Rails和脚本/控制台的功能,但是当它把所有这些都转储到屏幕上时,它几乎不可用。我知道通常情况就是这样。事实上,我已经对多达50万左右的用户进行了不同大小的记录集负载测试。在PHP中,sql与服务器脚本之间的性能约为1:3。通常情况下,进行比较的最佳方法是在方法内。所以,我的问题仍然存在,为什么它会将所有结果打印到屏幕上
def f
User.find(:all, :conditions => ["sqrt(pow(69.1*(lat - ?),2) + pow(49*(lon - ?),2)) < 1", lat.to_s,lon.to_s])
end