我有两个型号
{{1}}
我希望self.similar方法能够产生类似于传递给它的产品(产品)。
我遇到的麻烦是这种方法只能完美地返回与参数匹配的产品。我想知道是否有可能设定这种方法的容忍度来产生更广泛的产品而不是完全符合论证的产品?或者也许是生产一系列类似产品的另一种优越方式。
答案 0 :(得分:1)
您必须简单地将查询位置更改为以下内容:
def self.similar(product)
where("name LIKE ?", "%#{product.name}%").limit(4)
end
并且您的LIKE查询应该正常工作..在开头和结尾处的%也不会返回完全匹配的结果..
答案 1 :(得分: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
答案 2 :(得分:0)
如果您不想/无法安装gem,则可以使用Postgres的levenshtein
(如果已安装):
Model.select("*, levenshtein(LOWER(name) , '#{thing_name.downcase}') AS fuzzydist").order('fuzzydist ASC').first