按栏中的列名搜索

时间:2016-12-08 16:32:41

标签: ruby-on-rails search

虽然我以前曾问过这个问题,但还没有解决。 我有一个学生模型,其中包含NAME,SCHOOLNAME,PARENTNAME等列。 我现在要做的是搜索用户可以使用以下列名称搜索的位置... 例如:如果用户将NAME放入搜索栏,那么他应该获得学生的所有姓名,如果用户使用术语学校名称搜索,那么他应该获得所有学校名称.... 我尝试了很多,但没有实现我想要的 将不胜感激帮助...谢谢

很抱歉没有以适当的方式添加此问题。

在我的项目中添加@fbelanger解决方案后,实际上没有任何事情发生,无论我搜索它给我相同的结果......

我的控制器

class DataController < ApplicationController
  before_action :set_datum, only: [:show, :edit, :update, :destroy]

  # GET /data
  # GET /data.json
  def index
    @data = Datum.all
    query = params[:query]
    Datum.all.map(&:query) if Datum::QUERIABLE.include?(query)
  end
  # GET /data/1
  # GET /data/1.json
  def show
  end

  # GET /data/new
  def new
    @datum = Datum.new
  end

  # GET /data/1/edit
  def edit
  end

  # POST /data
  # POST /data.json
  def create
    @datum = Datum.new(datum_params)

    respond_to do |format|
      if @datum.save
        format.html { redirect_to @datum, notice: 'Datum was successfully created.' }
        format.json { render :show, status: :created, location: @datum }
      else
        format.html { render :new }
        format.json { render json: @datum.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /data/1
  # PATCH/PUT /data/1.json
  def update
    respond_to do |format|
      if @datum.update(datum_params)
        format.html { redirect_to @datum, notice: 'Datum was successfully updated.' }
        format.json { render :show, status: :ok, location: @datum }
      else
        format.html { render :edit }
        format.json { render json: @datum.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /data/1
  # DELETE /data/1.json
  def destroy
    @datum.destroy
    respond_to do |format|
      format.html { redirect_to data_url, notice: 'Datum was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_datum
      @datum = Datum.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def datum_params
      params.require(:datum).permit(:name, :school, :hospital, :city, :food)
    end
end

我的模特

class Datum < ActiveRecord::Base
    QUERIABLE = %w(name city)

end

我的索引

<p id="notice"><%= notice %></p>

<h1>Listing Data</h1>

<%= form_tag(data_path, :method => "get", id: "search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search here" %>
<%= submit_tag "Search" %>
<% end %>

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>School</th>
      <th>Hospital</th>
      <th>City</th>
      <th>Food</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @data.each do |datum| %>
      <tr>
        <td><%= datum.name %></td>
        <td><%= datum.school %></td>
        <td><%= datum.hospital %></td>
        <td><%= datum.city %></td>
        <td><%= datum.food %></td>
        <td><%= link_to 'Show', datum %></td>
        <td><%= link_to 'Edit', edit_datum_path(datum) %></td>
        <td><%= link_to 'Destroy', datum, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Datum', new_datum_path %>

2 个答案:

答案 0 :(得分:0)

假设我们正在执行一些控制器操作:

query = params[:query].underscore
Student.all.map(&:query) if Student::QUERIABLE.include?(query)

然后我会在我的QUERIABLE模型中添加Student常量,这样用户就无法查询除了我允许的内容之外的任何内容。

QUERIABLE = %w(name school_name parent_name)

没有人回答这个问题的原因是因为你没有要求问题的技术解决方案,更像是要求最终结果工作。

虽然你说你“尝试了很多”,但我对此表示高度怀疑,你没有提供你迄今为止尝试过的任何例子,自上次你发布以来,你的问题根本没有进化

修改

“没有发生”的原因是因为您没有将数组分配给变量。

此外,当您的视图与呈现记录相关联时,您需要以某种方式使用数组来显示名称。

答案 1 :(得分:0)

您可以通过使用include?方法(https://ruby-doc.org/core-2.2.0/String.html#method-i-include-3F

搜索查询字符串以查看是否包含您的列名称来完成此操作

然后你可以在你的数据库上运行LIKE搜索,这可能看起来有几种不同的方式,具体取决于你的数据库(What's the best way to include a LIKE clause in a Rails query?

要进一步了解@ fbelanger的观点,你应该具体说出你曾经尝试过的内容,最好是通过包含一个代码示例(即使它只是使用假的东西,比如class Foo...)。

我还建议考虑其他更加用户友好的选项,例如提供列搜索字段的下拉列表,以便最终用户更轻松地了解如何与搜索表单,更容易让您的代码知道要搜索的列。 (只是一个建议)。

〜祝你好运