Rails使用表单基于多个参数搜索模型

时间:2014-07-26 00:51:37

标签: mysql ruby-on-rails search params

所以......我一直在为rails应用程序创建搜索表单。我已经浏览了第37,111和112号轨道播放节目。

虽然带文本输入字段的简单文本搜索有效。我需要能够定义更多参数来优化搜索。

我发现了一些其他方法,其中一些使用范围...我一直遇到问题,让我的应用程序中的任何一个工作....

我现在所拥有的是一个在我的家庭索引上定义的简单形式,它指向我的资产索引:

<% form_tag assets_path, :method => 'get' do %>
  <%= text_field_tag :search, params[:search] %>
  <%= collection_select(:type_id, :type_id, Type.where("type_for = 'asset'"), :id, :name) %>
  <%= submit_tag "Search", :search => nil %>
<% end %>

我的asset.rb模型:

class Asset < ActiveRecord::Base

  has_many :children_assets, :class_name => "Asset"
  has_and_belongs_to_many :groups, :join_table => "assets_groups"

  belongs_to :parent_asset, 
         :class_name => "Asset", 
         :foreign_key => "parent_asset_id"

  belongs_to :asset_type, 
         :class_name => "Type", 
         :conditions => "type_for = 'asset'"

  belongs_to :asset_status, 
         :class_name => "Status", 
         :conditions => "status_for = 'asset'"

  belongs_to :location
  belongs_to :funding_source

  has_many :transactions

  def self.search(search)
      if search
        find(:all, :conditions => ['nmc_name LIKE ? AND type_id = ?', "%#{search}%", "%#{search}"])
      else
        find(:all)
      end
    end

  end
asset_controller.rb

中的

def index
  unless params[:search].nil?
    @title = "Assets"
    @search = params[:search]
    @assets = Asset.search(params[:search]).paginate(page: params[:page], per_page: 25)
  else
    @title = "Assets"
    @assets = Asset.where('').paginate(page: params[:page], per_page: 25)
  end

end

我只是不明白我在这里看不到的是什么。我可以运行类似的mysql查询并获得我想要的结果。我只是不知道如何在rails中格式化这个...

现在任何关于此的指导都会令人惊叹。谢谢!

1 个答案:

答案 0 :(得分:0)

看起来您正在尝试搜索特定类型的资产,但search模型中的Asset方法仅使用用户提供的参数之一。

根据您使用的表格判断,您的控制器将收到参数

params = {
  search: 'Search Text',
  type_id: 1
}

在您的控制器中,您只使用搜索,因此我会更改您的方法以包含此内容:

@assets = Asset.search(params[:search], params[:type_id]).paginate(page: params[:page], per_page: 25)

然后修改Assets模型以使用它

def self.search(search, type_id)
  if search
    find(:all, :conditions => ['nmc_name LIKE ? AND type_id = ?', "%#{search}%", "%#{type_id}"])
  else
    find(:all)
  end
end