我基本上有this问题,除了我还希望用户能够动态添加和删除搜索字段。基本上,用户从下拉菜单中选择属性字段和谓词,然后将文本输入搜索框。所以它看起来像这样:
student.last_name contains "stein"
从下拉菜单中选择“student.last_name”和“contains”。
但我正在为此添加一个动态部分,这会带来一个选项,可以使用第二个(相同的)查询加入上一个查询。用户被授予使用“或”或“和”加入查询的选项。
基本上,用户可以进行如下搜索:
student.last_name contains "ma" AND
student.first_name does not equal "john" OR
student.graduated equals "true"
这是绊倒我的动态部分。
这是我的search.html.erb:
<%= form_tag(search_students_path, :method => "post", id: "search-form") do %>
<div class="fields">
<%= render :partial => 'students/condition_fields' %>
</div>
<%= submit_tag "Search", class: "search_button" %>
<% end %>
我的_condition_fields.html.erb:
<%= select_tag "search_from", "<option> first_name </option>
<option> last_name </option>
<option> age </option>
<option> graduated </option>".html_safe %>
<%= select_tag "predicate", "<option> equals </option>
<option> does not equal </option>
<option> contains </option>
<option> does not contain </option>".html_safe %>
<%= text_field_tag :search, params[:search], placeholder: "enter value...", class: "big_searchbox" %>
我的控制器代码:
def search
@students = Student.search(params[:search], params[:search_from], params[:conjunction])
最后,我的模特:
def self.search(search, search_from, conjunction)
if search
query = [search_from + conjunction + "?", search]
includes(:tags, :workstations).where(query)
end
end
我的condition_fields是我想要动态添加和删除的部分(以及每个额外搜索条件之前的连接下拉菜单)。
我知道一些宝石可能对此有所帮助,但到目前为止,它们都没有轻易提供用“或”和“和”连词动态添加字段的能力,我想自己学习这个实践。