SQL .where查询生成奇怪的结果(Rails)

时间:2018-08-04 22:54:30

标签: sql ruby-on-rails

我正在使用简单的搜索来查询数据库。

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(效果很好)完成了过滤部分,但是看到它很混乱,因为它会产生两个视图和索引视图中的额外逻辑。

视图中的fileroutes很好。我认为不需要在这里粘贴它们。

有什么想法吗?

2 个答案:

答案 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}%")

请注意日期-如果您尝试搜索不是有效日期的字符串,则将引发日期解析错误。如果日期类型是字符串,那么它将有任何错误。