【问题标题】:Rails search with 2 select_tag使用 2 个 select_tag 进行 Rails 搜索
【发布时间】:2016-12-06 08:58:11
【问题描述】:

我想使用两个select_tags 进行搜索。实际上,这一切都可以单独工作,但我想在第一个/第二个标签中使用选择一个选项,然后搜索开始,然后 - 在第二个/第一个标签中选择一个选项,然后查看更详细的搜索结果。目前,我有:

产品型号:

class Product < ApplicationRecord
  belongs_to :position
  has_and_belongs_to_many :size
end

尺寸型号:

class Size < ApplicationRecord
  has_and_belongs_to_many :products
  has_many :items
end

定位模型:

class Position < ApplicationRecord
  has_many :products
end

我的application.html.erb

<div class="container">
    <div class="row text-center">
      <div class="col-sm-6">
        <%= form_tag(products_path, method: 'GET', remote: true) do %>
          <%= select_tag 'size_id', options_from_collection_for_select(Size.all, 'id', 'title'),
                         onchange: ('this.form.submit();'), class: 'form-control', id: 'filter1', include_blank: true %>
        <% end %>
      </div>
      <div class="col-sm-6">
        <%= form_tag(products_path, method: 'GET') do %>
          <%= select_tag 'position_id', options_from_collection_for_select(Position.all, 'id', 'title'),
                         onchange: ('this.form.submit();'), class: 'form-control', id: 'filter2', include_blank: true %>
        <% end %>
      </div>
    </div>
  </div>

还有一个products_controller

class ProductsController < ApplicationController
  def index    
    if params[:position_id]
      position = Position.find(params[:position_id])
      @products = position.products
      respond_to do |format|
        format.html
        format.json { render json: @products }
      end
    elsif params[:size_id]
      size = Size.find(params[:size_id])
      @products = size.products
      respond_to do |format|
        format.html
        format.json { render json: @products }
      end
    else
      @products = Product.all
      respond_to do |format|
        format.html
        format.json { render json: @products }
      end
    end
  end
end

那么,我怎样才能进行不单独工作的搜索?先谢谢了。

【问题讨论】:

    标签: ruby-on-rails search drop-down-menu ruby-on-rails-5


    【解决方案1】:

    首先,如果你想让它们一起工作,我认为你应该把两个 select_tags 放在同一个表单中。

      <div class="container">
        <div class="row text-center">
          <%= form_tag(products_path, method: 'GET', remote: true) do %>
          <div class="col-sm-6">
              <%= select_tag 'size_id', options_from_collection_for_select(Size.all, 'id', 'title'),
                             onchange: ('this.form.submit();'), class: 'form-control', id: 'filter1', include_blank: true %>
          </div>
          <div class="col-sm-6">
              <%= select_tag 'position_id', options_from_collection_for_select(Position.all, 'id', 'title'),
                             onchange: ('this.form.submit();'), class: 'form-control', id: 'filter2', include_blank: true %>
          </div>
          <% end %>
        </div>
      </div>
    

    然后您需要更改控制器以使用您拥有的参数:

    def index
      @products = Product.scoped  # or Product.all if you are using Rails 4.0.13 or newer
      @products = @products.where(position_id: params[:position_id]) if params[:position_id].present?
      @products = @products.where(size_id: params[:size_id]) if params[:size_id].present?
      respond_to do |format|
        format.html
        format.json { render json: @products }
      end
    end
    

    这样,控制器将只添加您发送到 SQL 命令的 WHERE 部分的参数。

    > Product.scoped
      SELECT `products`.* FROM `products` 
    
    > Product.scoped.where(position_id: 1)
      SELECT `products`.* FROM `products` WHERE `products`.`position_id` = 1
    
    > Product.scoped.where(size_id: 1)
      SELECT `products`.* FROM `products` WHERE `products`.`size_id` = 1
    
    > Product.scoped.where(position_id: 1).where(size_id: 1)
      SELECT `products`.* FROM `products` WHERE `products`.`position_id` = 1 AND `products`.`size_id` = 1
    

    【讨论】:

      【解决方案2】:
      search_parameters = {
        :position_id => params[:position_id],:size_id => params[:size_id]}
        .select { |key,value| value.present? }
      
      @products = Product.where(
        search_parameters, params[:position_id], params[:size_id])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 2021-12-15
        • 2014-08-27
        • 1970-01-01
        相关资源
        最近更新 更多