Печать скриптов / консолей Ruby on Rails превзошла все ожидания - PullRequest
0 голосов
/ 27 апреля 2010

У меня есть простая настройка модели в моем приложении 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 голосов
/ 06 мая 2010

Похоже, что консольный интерфейс приложения Ruby оценивает каждую строку, как если бы она была введена из консоли.

Я бы ожидал, что это произойдет с некоторой инкапсуляцией скриптов, но это имеет смысл, так как он интерпретируется на лету строкой интерактивной консоли ruby.

И чтобы уточнить предпочтительное базовое решение sql, выполнение 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
0 голосов
/ 27 апреля 2010

вы должны обработать это с помощью запроса 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)

Вышеприведенный запрос является лишь примером, но всегда полезно делать что-то подобное выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...