1

parent.rb on Rails的4搜索時如何忽略大小寫敏感的,包括嵌套文件與Mongoid

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 

parents_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. 當我有2名:Alex和小亞歷克斯,當我搜索 「亞歷克斯」,它給我的只有一個結果。但我希望「Alex Jr」也以 作爲搜索結果。
  2. 我的搜索對大小寫敏感。我想忽略這一點。
  3. 我希望不僅能夠在主文檔中進行搜索,還能夠在所有級別的嵌套文檔中搜索 。在這種情況下,我將主文檔作爲模型parent.rb並嵌套一個名爲child.rb。所以,例如,當我搜索名字時,我不僅要搜索父母的名字,還要搜索他的孩子。
  4. 我想通過指定日期範圍添加搜索功能。 例如,查找從A日期到B日期出生的所有記錄。

回答

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 - 我不明白你有什麼問題。

+0

謝謝。我編輯了第三個問題。我的意思是我想跨越搜索到嵌套(子)文件。現在,我已經解決了問題1,2和4. :) – Askar

+0

嘗試此鏈接:http://stackoverflow.com/questions/652933/rails-searching-multiple-tables-from-one-query。我希望它也適用於mongoid。如果沒有,那麼在將搜索功能添加到Child之後,怎麼樣:@items = Parent.search(params [:search],params [:search_to])+ Child.search(params [:search],params [:search_to])。 rb? – user2503775