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

时间:2010-04-26 20:27:03

标签: ruby-on-rails activerecord

我的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)

所以,我想我想知道它为什么打印整个结果集,如果有办法压制它以便只打印我想要的东西?

2 个答案:

答案 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