如何使用 Sunspot 在 Rails 范围内枚举?
How Do I Scope Enums in Rails Using Sunspot?
我正在尝试使用 Sunspot (Rails Solr gem) 使用我在模型中声明的枚举来确定结果范围。我模型的相关部分如下所示:
searchable do
text :tag_list
boolean :approved
integer :perspective
time :created_at
end
enum perspective: [ :not_applicable, :front, :side_front, :side, :side_back, :back, :above, :below ]
我的控制器中的搜索块如下所示:
def index
//skip scoping if perspective is nil
params[:perspective] ||= []
@search = Upload.search do
with :approved, true
with :perspective, params[:perspective]
fulltext params[:tag]
fulltext params[:search] do
minimum_match 1
end
paginate page: params[:page], per_page: 30
end
@uploads = @search.results
@query = params[:search]
end
我用来收集参数的 link 看起来像这样:
<%= link_to upload.perspective.humanize, search_index_path(perspective: Upload.perspectives[upload.perspective]), class: "perspective" %>
基本上我正在尝试设置它,以便它 returns 所有这些标准的任意组合的结果在范围界定获得批准后。我已经使用基于文本的搜索条件进行了处理,但是透视范围界定不起作用。搜索只是 returns 0 的所有结果和 none 任何其他值的结果。我是否遗漏了一些关于 Sunspot/Solr 如何与枚举一起使用的信息?当我执行诸如 Upload.where(perspective: 1) 之类的查询时,我得到了正确的结果,所以我不确定为什么这不起作用。
提前致谢。
Rails 枚举是一个相当黑暗的魔法。记住它是数据库中的所有整数。
我打赌你的 params[:perspective]
是一个字符串(比如 'front'
)而不是一个基础整数。另一方面,调用 Model.perspectives[:front]
将 return 正确的整数值。
尝试使用
将其转换为基础价值
Model.perspectives[params[:perspective]]
在传递给搜索方法之前。
更多信息在这里:rails docs
我终于解决了这个问题。问题在于,尽管 Rails 将枚举值作为整数存储在数据库中,但当您调用枚举属性(在本例中为 @upload.perspective)时,它不会检索该整数。这 returns 改为对应于值名称的字符串(在本例中为 "front"、"side" 等)。问题在于,在我的可搜索块中,我将透视字段声明为整数。
解决方法:
模型中获取枚举 ID 整数而不是名称的方法:
def perspective_id
Upload.perspectives[self.perspective]
end
修改可搜索块:
searchable do
text :tag_list
boolean :approved
integer :perspective_id
time :created_at
end
以及控制器中的搜索块:
def index
#if no perspective, set to empty hash so solr skips
params[:perspective] ||= []
@search = Upload.search do
with :approved, true
with :perspective_id, params[:perspective]
fulltext params[:tag]
fulltext params[:search] do
minimum_match 1
end
paginate page: params[:page], per_page: 30
end
@uploads = @search.results
@query = params[:search]
end
您实际上不必编写那些额外的代码。就像这样:
searchable do
#...
string :perspective
#...
end
#while searching
with :perspective, 'above'
我正在尝试使用 Sunspot (Rails Solr gem) 使用我在模型中声明的枚举来确定结果范围。我模型的相关部分如下所示:
searchable do
text :tag_list
boolean :approved
integer :perspective
time :created_at
end
enum perspective: [ :not_applicable, :front, :side_front, :side, :side_back, :back, :above, :below ]
我的控制器中的搜索块如下所示:
def index
//skip scoping if perspective is nil
params[:perspective] ||= []
@search = Upload.search do
with :approved, true
with :perspective, params[:perspective]
fulltext params[:tag]
fulltext params[:search] do
minimum_match 1
end
paginate page: params[:page], per_page: 30
end
@uploads = @search.results
@query = params[:search]
end
我用来收集参数的 link 看起来像这样:
<%= link_to upload.perspective.humanize, search_index_path(perspective: Upload.perspectives[upload.perspective]), class: "perspective" %>
基本上我正在尝试设置它,以便它 returns 所有这些标准的任意组合的结果在范围界定获得批准后。我已经使用基于文本的搜索条件进行了处理,但是透视范围界定不起作用。搜索只是 returns 0 的所有结果和 none 任何其他值的结果。我是否遗漏了一些关于 Sunspot/Solr 如何与枚举一起使用的信息?当我执行诸如 Upload.where(perspective: 1) 之类的查询时,我得到了正确的结果,所以我不确定为什么这不起作用。
提前致谢。
Rails 枚举是一个相当黑暗的魔法。记住它是数据库中的所有整数。
我打赌你的 params[:perspective]
是一个字符串(比如 'front'
)而不是一个基础整数。另一方面,调用 Model.perspectives[:front]
将 return 正确的整数值。
尝试使用
Model.perspectives[params[:perspective]]
在传递给搜索方法之前。
更多信息在这里:rails docs
我终于解决了这个问题。问题在于,尽管 Rails 将枚举值作为整数存储在数据库中,但当您调用枚举属性(在本例中为 @upload.perspective)时,它不会检索该整数。这 returns 改为对应于值名称的字符串(在本例中为 "front"、"side" 等)。问题在于,在我的可搜索块中,我将透视字段声明为整数。
解决方法:
模型中获取枚举 ID 整数而不是名称的方法:
def perspective_id
Upload.perspectives[self.perspective]
end
修改可搜索块:
searchable do
text :tag_list
boolean :approved
integer :perspective_id
time :created_at
end
以及控制器中的搜索块:
def index
#if no perspective, set to empty hash so solr skips
params[:perspective] ||= []
@search = Upload.search do
with :approved, true
with :perspective_id, params[:perspective]
fulltext params[:tag]
fulltext params[:search] do
minimum_match 1
end
paginate page: params[:page], per_page: 30
end
@uploads = @search.results
@query = params[:search]
end
您实际上不必编写那些额外的代码。就像这样:
searchable do
#...
string :perspective
#...
end
#while searching
with :perspective, 'above'