Rails搜索表单,两个模型

时间:2015-04-08 16:10:29

标签: ruby-on-rails ruby rails-activerecord

我正在尝试在Rails 4中实现一个搜索字段来查找两个模型背后的数据。我有两个控制器:建筑物和房间,以及两个模型:建筑和房间。当然,建筑物有许多房间,房间属于建筑物,我在各自的模型中都有说明。

基本上,用户可以在搜索表单中键入建筑物或房间名称,并返回包含建筑物或房间详细信息的响应。当然,建筑物需要有地址,房间需要知道它在哪个建筑物的地址。所以我需要根据搜索到的例子显示不同的细节。两者都具有相同的String属性name,因此这可以使事情变得更容易。

我找不到有关如何实施此类搜索表单的相关示例。这是我views\buildings\index.html.erb目前正在进行的基本搜索,它只能搜索建筑物:

<%= form_tag({controller: "buildings", action: "show"}, method: "get", class: "nifty_form") do %>
  <%= label_tag(:name, "Search for a building (later also rooms):") %>
  <%= text_field_tag(:name) %>
  <%= submit_tag("Search") %>
<% end %>

这是show中的controllers\buildings_controller.rb方法:

def show
  @building = Building.where('lower(name) = ?', params[:name].downcase).first
end

这是它所指的路线:

get 'buildings/:id' => 'buildings#show'

感谢任何和所有帮助!

2 个答案:

答案 0 :(得分:2)

我建议你在建筑物控制器的索引方法中添加搜索代码,你可以做很多事情但是我会推荐这个:

def index
   # 
   if params.has_key?(:name)
     @buildings = Building.joins(:rooms).
                  where([
                     'lower(buildings.name) like ? or lower(rooms.name) like ?', 
                     "%#{params[:name].downcase}%",
                     "%#{params[:name].downcase}%"
                  ])
   else
     # your normal code goes here.
   end
end

您需要的任何其他信息(包括不同的型号)都可以包含在那里。

希望这有帮助,

PD:如果需要,您可以在if块中存在搜索时呈现不同的视图

render action: 'my_custom_view', status: :ok

答案 1 :(得分:0)

由于时间限制,我决定将这些模型合并为一个通用模型Space。它包含建筑物和房间所需的所有信息。不管怎样,谢谢!