Как найти три лучших соответствия для поиска модели в Ruby on Rails? - PullRequest
0 голосов
/ 04 июня 2011

Я создаю поиск собак, чтобы помочь людям выбрать лучшую породу собак для их образа жизни.

Итак, я создал собаку с помощью скаффолда (можно сказать, я тогда создал модель собаки?)

class CreateDogs < ActiveRecord::Migration
    def self.up
        create_table :dogs do |t|
            t.string :breed
            t.integer :speed
            t.integer :size
            t.integer :friendly
            t.timestamps
        end
    end
end
  • speed оценивается от 1 до 10, самый быстрый - 10.
  • size - от 1 до 10, самый тяжелый - 10
  • friendly имеет рейтинг 1-10, 10 - самый дружелюбный.

Порода: например, Golden Lab имеет оценку

  • скорость = 5
  • size = 8
  • friendly = 10

Я создаю форму для пользователей, чтобы заполнить диапазон атрибутов, которые они ищут, чтобы они искали

  • speed = 10
  • size = 5
  • friendly = 10

Как бы я вернул три первых совпадения породы для их условий поиска, используяRuby on Rails?

Я искал оператор <=>, sort_by, но я не уверен, как связать все это вместе.Сначала я подумал, что это простой поиск - но все элементы нужно сравнивать друг с другом.

Кроме того, как я могу добавить вес к дружелюбию, поэтому это важнее, чем два других атрибута с точки зренияВыбор собаки?

Я новичок в Ruby on Rails, поэтому извините, если я использую неправильные термины.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Вы можете вычислить разницу между запрошенным и фактическим значением и получить абсолютное значение (т.е. сделать все отрицательные числа положительными), чтобы увидеть, насколько близко желание к реальности:

abs(wanted_speed - speed)
abs(wanted_size - size)
abs(wanted_friendly - friendly)

Затем сложитеувеличьте эти различия, чтобы увидеть, насколько запрашиваемые значения отличаются от фактических значений каждой собаки.

Чтобы определить вес любого атрибута, просто умножьте его на некоторое значение, прежде чем суммировать.

Может быть, этоworking:

@dogs = Dog.all(
  :order => ["ABS(speed - ?) + ABS(size - ?) + (ABS(friendly - ?) * 3)", 
             params[:speed], params[:size], params[:friendly]], 
  :limit => 3)

Для веса вы также можете добавить переменные в вашей форме (например, важные = 3, неважно = 2, не важно вообще = 1) и вместо этого добавить их в запросв жестком коде 3.

0 голосов
/ 05 июня 2011
@dogs = Dog.all(:limit => 3, :order => "speed + size + friendly DESC")

Если вы добавите взвешивание, вы можете добавить множители, например, это увеличит дружественность по отношению к весу вдвое и к тройному размеру:

@dogs = Dog.all(:limit => 3, :order => "speed + (3 * size) + (2 * friendly) DESC")
...