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