我的Ruby on Rails应用程序中有一个简单的模型设置。 (用户{name,username,lat,lon})并正在为模型编写基本扩展。我希望该方法在一定距离内返回用户。它在页面视图中都运行良好,但在我调试时,我想使用脚本/控制台进行一些测试。
我的问题:当我从命令行和脚本/控制台运行它时,似乎是在屏幕上打印整个结果集。
我的模特:
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
并从命令行运行
>> u = User.find_by_username("someuser")
>> print u.users_within(1)
所以,我想我想知道它为什么打印整个结果集,如果有办法压制它以便只打印我想要的东西?
答案 0 :(得分:0)
你应该使用mysql查询来处理它。 从数据库perofrm中提取所有数据并从中显示前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)
以上查询只是一个例子,但做上面的事情总是好的做法。
答案 1 :(得分:0)
Ruby应用程序的控制台界面似乎评估每一行,就像从控制台输入一样。
我原本期望它能够对脚本进行一些封装,但它有意义,因为它是由ruby交互式控制台线路实时解释的。
为了澄清首选的sql base解决方案,在我发现的大多数引用中,做find_by_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