2015-07-06 3 views
0

У меня есть две моделиRails - Найти похожие продукты

class Category < ActiveRecord::Base 
    has_many :products 
end 

class Product < ActiveRecord::Base 
    has_many :photos 
    belongs_to :category 

    def self.similar(product) 
    where("name LIKE ?", "#{product.name}%").limit(4) 
    end 
end 

Я хотел бы self.similar метод к продуктам продукта, которые похожи на аргумент, переданный ему (продукт).

Проблема с Im заключается в том, что этот метод возвращает только те продукты, которые соответствуют аргументу. Мне интересно, можно ли установить терпимость этого метода к продукту более широкого спектра продуктов, а не тех, которые идеально соответствуют аргументу? Или, возможно, еще один лучший способ создать массив подобных продуктов.

ответ

1

Вы должны просто изменить ваш запрос, где к следующему:

def self.similar(product) 
    where("name LIKE ?", "%#{product.name}%").limit(4) 
end 

и ваш LIKE запрос должен work..with в% при начало и конец также не точно соответствуют результаты будут возвращены.

0

У меня был очень хороший опыт с помощью fuzzy_match. В противном случае нет встроенной поддержки ActiveRecord, Rails и Ruby.

Так что ваш код будет тогда более или менее

require 'fuzzy_match' 

class Category < ActiveRecord::Base 
    has_many :products 
end 

class Product < ActiveRecord::Base 
    has_many :photos 
    belongs_to :category 

    def self.similar(product) 
    fz = FuzzyMatch.new(Product.all, :read => :name) 
    return fz.find(product.name).limit(4) 
    end 
end 
+0

У меня есть 150 тыс. записей, которые растут 10 тыс. каждый месяц. если я сорвлю все, это звучит не так круто для меня. как этот масштаб в больших условиях? –

Смежные вопросы