0

parent.rb

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

  embeds_many :children
  accepts_nested_attributes_for :children
end

children.rb

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

  embedded_in :parent
end

parents_controller.rb

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

  # GET /parents
  # GET /parents.json
  def index
    @parents = Parent.all
  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

Parents' index.html.erb:

<h1>Listing parents</h1>

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Born</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>

  <tbody>
    <% @parents.each do |parent| %>
      <tr>
        <td><%= parent.name %></td>
        <td><%= parent.born %></td>
        <td><%= link_to 'Show', parent %></td>
        <td><%= link_to 'Edit', edit_parent_path(parent) %></td>
        <td><%= link_to 'Destroy', parent, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Parent', new_parent_path %>

I want to implement a search feature to search not only in the main document but in the nested as well. Search not only in text fields, but also with date ranges. Can anyone point me any resource (tutorial) regarding this? I couldn't find anything like Ryan's Simple Search railscast. I'd very obliged if someone could show me how I will have to modify my controllers and index.html.erb files.

There's also a Durran's page related to search in the github https://github.com/mongoid/mongoid/blob/master/lib/mongoid/contextual/text_search.rb. But frankly speaking it didn't give any clue to solve my issue.

4

2 回答 2

2

例如,您需要让您的index方法采用search参数

def index
  @parents = if params[:search]
               Parent.where(name: params[:search])
             else
               Parent.all
             end
end

这是基本思想。您可以考虑使用一个类方法来进行更复杂的搜索(born例如使用属性)。

def index
  if params[:search]
    @parents = Parent.search_for(params[:search])
  else
    @parents = Parent.all
  end
end

在您的模型中:

class Parent
  def search_for(criterias)
    # Logic regarding criterias selection should go here.
    # Very basic idea bellow
    Parent.where(name: criterias[:name], born: criterias[:born])
  end
end

在您看来:

// First case
<%= text_field_tag :search, '' %>

// Second case
<%= text_field_tag 'search[name]', '' %>
<%= text_field_tag 'search[born]', '' %>
于 2013-07-01T07:17:37.023 回答
1

感谢@Pierre-Louis Gottfrois 的建议,帮助我进行了进一步的研究。

我能够在两个字段(姓名和爱好)上进行搜索,如下所示。

我已经添加到产品的 index.html.erb 中:

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

然后在 parent.rb 模型中,考虑到@Pierre-Louis Gottfrois 的建议,我进行了更改:

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

products_controller.rb 更改:

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

仍然存在 3 个问题,我认为最好将它们分成不同的帖子:

  1. 如何在搜索时忽略区分大小写
  2. 如何搜索包括嵌套文档
  3. 能够通过指定日期范围进行搜索
  4. 如果任何单词包含搜索关键字,则将其视为结果
于 2013-07-01T10:21:57.690 回答