Ruby on rails RubyonRails:使用布尔postgres进行搜索

Ruby on rails RubyonRails:使用布尔postgres进行搜索,ruby-on-rails,ruby,postgresql,boolean,Ruby On Rails,Ruby,Postgresql,Boolean,我有一个应用程序,允许用户在数据库中输入、编辑和搜索项目 在“我的搜索”函数中,可以通过向搜索中添加参数来执行复杂的搜索 def self.like(text); "%#{text}%"; end def self.search(search_archive, search_client, search_status, search_fullname) # start with a scoped query, to apply more scopes on it afterward

我有一个应用程序,允许用户在数据库中输入、编辑和搜索项目

在“我的搜索”函数中,可以通过向搜索中添加参数来执行复杂的搜索

def self.like(text); "%#{text}%"; end

  def self.search(search_archive, search_client, search_status, search_fullname)
    # start with a scoped query, to apply more scopes on it afterwards
    _projects = Project.scoped 
    # then, for each of the parameters, apply the scope only if present

    if search_archive.present?
      _projects = _projects.where ['archive LIKE ?', like(search_archive)] 
    end
    if search_client.present?
      _projects = _projects.where ['client LIKE ?', like(search_client)] 
    end

     if search_status.present?
      _projects = _projects.where ['status LIKE ?', like(search_status)]
    end

if search_fullname.present?
      _projects = _projects.where ['fullname LIKE ?', like(search_fullname)]
    end
    # now you have applied only the present scopes. return the result, and watch 
    # the query as it executes.

    _projects

  end
现在,我最近添加了归档项目的选项,该选项作为布尔值进入项目表

我知道我的搜索功能是错误的,因为我不认为我可以用我尝试过的方式处理布尔值

if search_archive.present?
          _projects = _projects.where ['archive LIKE ?', like(search_archive)] 
        end
以下是错误:

PG::Error: ERROR:  operator does not exist: boolean ~~ unknown
LINE 1: SELECT COUNT(*) FROM "projects"  WHERE (archive LIKE '%{"{:c...
有什么想法吗?提前谢谢

更新:

def search


    @search = params[:archive], params[:client], params[:status], params[:fullname]

    @project_search = Project.search(*@search).order(sort_column + ' ' + sort_direction).paginated_for_index(per_page, page)

    @search_performed = !@search.reject! { |c| c.blank? }.empty? 

  @project = Project.new(params[:project])


respond_to do |format|
      format.html # search.html.erb
      format.json { render :json => @project }
    end

end 
改为下面的建议

if search_archive.present?
  _projects = _projects.where(:archive => search_archive)
end
我得到这个错误:

PG::Error: ERROR:  missing FROM-clause entry for table "archive"
LINE 1: SELECT COUNT(*) FROM "projects"  WHERE "archive"."{:class=>"...
                                               ^
: SELECT COUNT(*) FROM "projects"  WHERE "archive"."{:class=>""archive""}" = '1'
以下是我的搜索操作:

def search


    @search = params[:archive], params[:client], params[:status], params[:fullname]

    @project_search = Project.search(*@search).order(sort_column + ' ' + sort_direction).paginated_for_index(per_page, page)

    @search_performed = !@search.reject! { |c| c.blank? }.empty? 

  @project = Project.new(params[:project])


respond_to do |format|
      format.html # search.html.erb
      format.json { render :json => @project }
    end

end 
添加部分搜索视图

<%= form_tag search_path, method: :get do %>

<% if current_user.try(:admin?) %>
Archive:
<%= check_box :archive, :class => "archive" %></H2>
<% end %>
<% if !current_user.try(:admin?) %>
<%= hidden_field :archive, :value => false %>
<% end %>

<div class="client">
Client : 
<%= select(@projects, :client, Project.order("client").map{|p| [p.client]}.uniq, :prompt => "-Any-", :selected => params[:client]) %></br>
</div>

<div class="buttons">
<div id="search_button">
<%= submit_tag "Search", name: nil, :class => "button" %>
</div>

<% end %>

档案文件:
“存档”%>
假%>
客户:
“-Any-”,:selected=>params[:client])%>
“按钮”%>
解释

如果我是管理员,并且未选中“存档”复选框,我希望查看所有未存档的项目。如果我检查它,我只想看到存档的文件,包括我搜索的其他参数


如果我是一个普通用户,我应该看不到“存档”复选框,我所做的每一次搜索都应该是在后台对包含“存档为假”的项目进行的。

如果
存档为布尔值,您希望在其上搜索“真”或“假”,并且
搜索\u存档也为布尔值,则您只需执行以下操作:

if search_archive.present?
  _projects = _projects.where(:archive => search_archive)
end
更新:

您的复选框语法错误,需要类似于:


复选框(“项目”、“归档”、“归档”{:class=>'archive'})

如果
归档
是布尔值,并且要在其上搜索true或false,并且
搜索归档
也是布尔值,则只需执行以下操作:

if search_archive.present?
  _projects = _projects.where(:archive => search_archive)
end
更新:

您的复选框语法错误,需要类似于:


复选框(“项目”、“存档”、{:class=>'archive'})
如果
存档
是布尔值,则添加如下内容

if search_archive.present?
  _projects = _projects.where(:archive => search_archive != "false")
end
改变

<% if current_user.try(:admin?) %>
Archive:
<%= check_box :archive, :class => "archive" %></H2>
<% end %>
<% if !current_user.try(:admin?) %>
<%= hidden_field :archive, :value => false %>
<% end %>

档案文件:
“存档”%>
假%>


存档:“存档”%>
假%>

如果
存档
是布尔值,则添加如下内容

if search_archive.present?
  _projects = _projects.where(:archive => search_archive != "false")
end
改变

<% if current_user.try(:admin?) %>
Archive:
<%= check_box :archive, :class => "archive" %></H2>
<% end %>
<% if !current_user.try(:admin?) %>
<%= hidden_field :archive, :value => false %>
<% end %>

档案文件:
“存档”%>
假%>


存档:“存档”%>
假%>

您好,我仍然收到一个错误。我已经用错误更新了我的问题,以及我的搜索操作。ThanksCheck您作为search\u archive变量传递的内容,它不是布尔值。对于true,它似乎传递的是
1
。但这在博士后中似乎还可以?嗨,我还是有一个错误。我已经用错误更新了我的问题,以及我的搜索操作。ThanksCheck您作为search\u archive变量传递的内容,它不是布尔值。对于true,它似乎传递的是
1
。但这在postgres中似乎还可以?我已经添加了我的搜索视图。我需要根据用户是否是管理员来搜索true或false。谢谢,似乎正在工作。但是,我需要每次搜索都将
archive
搜索为false,除非该框是ticket。这就是为什么只有管理员才能看到归档文件,而没有管理员会看到归档文件,因为每次搜索都会将
archive
搜索为false,只需更改为
\u projects=\u projects。其中(:archive=>search\u archive==“true”)
这似乎不会改变任何东西。为了让它更清楚一点,我更新了底部的问题,以解释我正在尝试做什么。只需删除搜索的if条件,我认为它将对您有效。我已添加我的搜索视图。我需要根据用户是否是管理员来搜索true或false。谢谢,似乎正在工作。但是,我需要每次搜索都将
archive
搜索为false,除非该框是ticket。这就是为什么只有管理员才能看到归档文件,而没有管理员会看到归档文件,因为每次搜索都会将
archive
搜索为false,只需更改为
\u projects=\u projects。其中(:archive=>search\u archive==“true”)
这似乎不会改变任何东西。为了让它更清楚一点,我更新了底部的问题来解释我想做什么。只要删除搜索的if条件,我想它会对你有用。