我正在使用简单的搜索来查询数据库。
在 model.rb 中,我有:
# condition for the search query [insert columns to iterate through]
def self.search(search)
if search
where(["bible_no || sample_no || location || experiment_details || sampled_type || sampled_by || date || file LIKE ?", "%#{search}%"])
else
all
end
end
在我的 controller.rb 中,我有:
def index
# checks if a user is logged in
if current_user
if params[:search].present?
@bibles = Bible.search(params[:search]).paginate(:page => params[:page])
else
@bibles = Bible.all.paginate(:page => params[:page])
end
# the index for the public view
else
if params[:search].present?
@bibles = Bible.all.where("location LIKE '%TULLOCH %'").search(params[:search]).paginate(:page => params[:page])
else
@bibles = Bible.all.where("location LIKE '%TULLOCH %'").paginate(:page => params[:page])
end
end
end
采用这种逻辑的原因是,我想进一步过滤可供公众(非登录用户)使用的视图,以仅显示其中“ location
”的行列包含“ TULLOCH”。一切都可以很好地过滤索引页面以供公众查看,除了在您实际执行搜索时,结果会丢失某些包含搜索词的行。例如,搜索“ 100”会完全丢失“ bible_no
”列属性中“ 100”的所有匹配项的90%,尽管其中有很多,但是很奇怪地在“ {{1}”中找到了相同的匹配项}”列属性。
我早些时候使用视图文件_partial(效果很好)完成了过滤部分,但是看到它很混乱,因为它会产生两个视图和索引视图中的额外逻辑。
视图中的file
和routes
很好。我认为不需要在这里粘贴它们。
有什么想法吗?
答案 0 :(得分:1)
您的问题是LIKE
的优先级比||
高,因此您的WHERE
条件实际上等于:
bible_no || sample_no || location || experiment_details || sampled_type || sampled_by || date || (file LIKE ?)
但是我认为您真正想要的是
bible_no LIKE ? ||
sample_no LIKE ? ||
location LIKE ? ||
experiment_details LIKE ? ||
sampled_type LIKE ? ||
sampled_by LIKE ? ||
date LIKE ? ||
file LIKE ?
请注意,要使用此查询,您需要将搜索值绑定8次而不是一次。
答案 1 :(得分:1)
下面的代码可能会对您有所帮助。
where("bible_no LIKE :search_query OR sample_no LIKE :search_query OR location LIKE :search_query OR experiment_details LIKE :search_query OR sampled_type LIKE :search_query OR sampled_by LIKE :search_query OR date LIKE :search_query OR file LIKE :search_query", search_query: "%#{search}%")
请注意日期-如果您尝试搜索不是有效日期的字符串,则将引发日期解析错误。如果日期类型是字符串,那么它将有任何错误。