我正在一个Rails4.2项目中改进搜索功能,遇到了searchkick和searchjoy gems的问题。
在Searchjoy ruby gem(v.0.3.2)文档中,它声明我们可以简单地通过调用search.convert
或search.convert(product)
来转换用户搜索。
"message":"undefined method `convert' for #\u003cSearchjoy::Search:0x0000ffff808cb010\u003e"
当我放入一个log语句search.methods
来查找实际可用的方法时,它显示确实在Searchjoy搜索对象中没有convert
方法,但是有很多方法没有在Searchjoy::Search中记录,例如convertable_id=,convertable_id_before_type_cast,convertable_id_came_from_user?,或convertable_id?。这些方法与searchjoy文档中存在的方法不一致。
我正在阅读的文档是从ruby gems页面链接的searchjoy 0.3.2文档:https://www.rubydoc.info/gems/searchjoy/0.3.2/Searchjoy/Search#convert-instance_method
我们将它与searchkick和elasticsearch结合使用。当需要搜索时,searchjoy搜索id从searchkick搜索结果results.search.id
中获取,其中results
是searchkick结果对象,results.search
是searchkick的关联searchjoy搜索。这就是我们如何为用户(其他用户)设置模型:
class User < ActiveRecord::Base
has_many :searches, class_name: "Searchjoy::Search", as: :convertable
has_many :conversions, class_name: "Searchjoy::Conversion", as: :convertable
searchkick conversions: [:conversions]
...
def search_data
{
...
conversions: searches.group(:query).uniq.count(:user_id)
}
end
...
有人知道我做错了什么吗?
更新:我更新到一个支持searchjoy转换的版本。我也在遵循searchkick 3.0的文档。它说要使用Searchjoy::搜索转换方法:
search = Searchjoy::Search.find(params[id])
search.convert # or search.convert(item)
但是searchjoy搜索仍然给我undefined method
错误。类肯定是Searchjoy::Search。我很想用文档中看到的convert方法覆盖我的初始化器中的类。
1条答案
按热度按时间o4hqfura1#
我发现我的描述中遗漏了一些相关的细节。
当我搜索时,我得到一个错误,说Searchjoy搜索字段
WARNING: Can't mass-assign protected attributes
:user_id,:search_type,:query等,新行将写入searchjoy_searches表,其中包含ID,但没有填写user_id等。为了解决这个问题,我创建了一个初始化器
config/initializers/searchjoy.rb
,如下所示:而不是使用
.class_eval
方法:前者允许我写入表而不会出错,但它显然也部分覆盖了Searchjoy::Search类:-(
现在,我可以在搜索示例中看到
convert
方法,并且能够正确地写入数据库。