【问题标题】:Search by column name in rails在rails中按列名搜索
【发布时间】:2016-12-08 16:32:40
【问题描述】:

虽然我之前问过这个问题,但还没有解决。 我有一个学生模型,其中包含 NAME、SCHOOLNAME、PARENTNAME 等列。 我现在要做的是进行搜索,当用户可以使用以下列名称进行搜索时...... 例如:如果用户在搜索栏中输入 NAME,那么他应该得到所有学生的名字,如果用户使用 SCHOOL 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 %>

【问题讨论】:

标签: ruby-on-rails search


【解决方案1】:

您可以使用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...)。

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

~祝你好运

【讨论】:

  • OP 想要从列中返回数据,而不是匹配记录。如果有人在搜索中输入“NAME”,则应该会出现所有 names。 LIKE 用于匹配基于数据的行,而不是列名。
【解决方案2】:

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

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

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

QUERIABLE = %w(name school_name parent_name)

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

尽管您说您“尝试了很多”,但我对此表示高度怀疑,并且您没有提供任何迄今为止您尝试过的示例,并且自上次发布以来您的问题根本没有发展.

编辑

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

此外,当您的视图与显示记录耦合时,您需要以某种方式使用数组显示名称。

【讨论】:

  • 嘿@fbelanger 很抱歉没有添加太多简短...我已经用您的解决方案编辑了问题,请看一下...
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2016-05-07
相关资源
最近更新 更多