1

親.rb

class Parent
  include Mongoid::Document

  field :name, type: String
  field :hobby, type: String
  field :born, type: Date

  has_many :children
  accepts_nested_attributes_for :children

  def self.search(search)
    if search
        any_of({name: search}, {hobby: search})
    end
  end
end

child.rb:

class Child
  include Mongoid::Document
  field :name, type: String
  field :hobby, type: String
  field :born, type: Date

  belongs_to :parent
end

parent_controller.rb

class ParentsController < ApplicationController
  before_action :set_parent, only: [:show, :edit, :update, :destroy]

  # GET /parents
  # GET /parents.json
  def index
    if params[:search].empty?
      @parents = Parent.all
    else
      @parents = Parent.search(params[:search])
    end
  end

  # GET /parents/1
  # GET /parents/1.json
  def show
  end

  # GET /parents/new
  def new
    @parent = Parent.new
  end

  # GET /parents/1/edit
  def edit
  end

  # POST /parents
  # POST /parents.json
  def create
    @parent = Parent.new(parent_params)

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

  # PATCH/PUT /parents/1
  # PATCH/PUT /parents/1.json
  def update
    respond_to do |format|
      if @parent.update_attributes(parent_params)
        format.html { redirect_to @parent, notice: 'Parent was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @parent.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /parents/1
  # DELETE /parents/1.json
  def destroy
    @parent.destroy
    respond_to do |format|
      format.html { redirect_to parents_url }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def parent_params
      params.require(:parent).permit(:name, :hobby, :born)
    end
end

製品の index.html.erb の検索タグ

<%= form_tag parents_path, :method => 'get' do %>
<p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
</p>
<% end %>

質問:

  1. Alex と Alex Jr. という 2 つの名前がある場合、「Alex」を検索すると、1 つの結果しか返されません。でも、「Alex Jr」も検索結果に出してほしい。
  2. 私の検索では大文字と小文字が区別されます。これは無視したいです。
  3. メインのドキュメントだけでなく、すべてのレベルのネストされたドキュメントも検索できるようにしたいと考えています。この場合、私はモデルのparent.rbと子.rbと呼ばれるネストされたものとしてメインドキュメントを持っています。そのため、たとえば名前を検索するときは、親の名前だけでなく、子供の名前も検索したいと思うでしょう。
  4. 日付範囲を指定して検索する機能を追加したいと考えています。たとえば、A 日から B 日までに生まれたすべてのレコードを検索するには、次のようにします。
4

1 に答える 1

3

あなたは書ける:

def self.search(search)
  if search
    any_of({name: /#{search}/i}, {hobby: /#{search}/i})
  end
end

これにより、大文字と小文字を区別せずに、この値を含むすべてのオブジェクトが得られます。

日付範囲による検索の追加について。コントローラーに追加の値を送信します (例: ~ search_to)。

def index
  @parents = if params[:search]
     Parent.search(params[:search], params[:search_to]) # when searching name/hobby, params[:search_to] will be nil
   else
     Parent.all
  end
end

検索機能:

def self.search(search, search_to)
  if search && search_to
    where(:born => {'$gte' => Date.parse(search),'$lt' => Date.parse(search_to)})
  elsif search
    any_of({name: /#{search}/i}, {hobby: /#{search}/i})       
  end
end

質問 3 - 何が問題なのかわかりません。

于 2013-07-01T13:50:53.353 に答える