Ruby on rails RubyonRails脚本/控制台打印超出预期

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

我在RubyonRails应用程序中有一个简单的模型设置。(User{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 

因此,我想知道它为什么要打印整个结果集,以及是否有办法抑制它,以便只打印我想要的内容?

您应该使用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