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条件,我想它会对你有用。