Ruby on rails RubyonRails-数组、搜索和返回

Ruby on rails RubyonRails-数组、搜索和返回,ruby-on-rails,arrays,where-clause,where,increment,Ruby On Rails,Arrays,Where Clause,Where,Increment,我是RoR的初学者,正在使用rails 3.2.3和ruby 1.8.7 这个论坛帮助我取得了进步,但有一件事让我感到困惑 我的应用程序应该允许根据选中的复选框搜索结果。在我的例子中,当用户检查确定的设施并单击“搜索”时,应该返回只有这些设施的相应酒店 我可以按名称/位置和评级进行搜索,但无法搜索设施 简单地说,我的控制器如下所示: def index @hotels= Hotel.search(params) (...) end 我的看法是: <b>Facilities:

我是RoR的初学者,正在使用rails 3.2.3和ruby 1.8.7

这个论坛帮助我取得了进步,但有一件事让我感到困惑

我的应用程序应该允许根据选中的复选框搜索结果。在我的例子中,当用户检查确定的设施并单击“搜索”时,应该返回只有这些设施的相应酒店

我可以按名称/位置和评级进行搜索,但无法搜索设施

简单地说,我的控制器如下所示:

def index
    @hotels= Hotel.search(params)
(...)
end
我的看法是:

<b>Facilities:</b><br />
<% for facility in Facility.find(:all) %>
  <div class="field">
  <%= check_box_tag "fc[]", facility.id%>
  <%= facility.description %>
  </div>
  <% end %>
<%= submit_tag "Search", :name => nil%>
(...)
<% @hotels.each do |hotel|%>
    <h2> <%= link_to hotel.name, hotel  %> </h2>
我不想用to_sql做这件事

另外,当我运行它时,如果我选中“设施”复选框,查询总是返回空结果,但这可能是我模型中该行代码的问题,但如果您看到一个问题,我希望您就与此问题相关的未来代码冲突提供一些提示


提前感谢您

这是您的问题,链接where将where条件与“AND”合并。检查development.log文件,如果您正在执行TDD,则检查test.log(您应该这样做)。这将生成SQL ActiveRecord。(我敢打赌,当您只选中一个复选框时,它会起作用。)

首先,检查您的假设,即params[:fc]是一个复选框数组。我经常抛出异常并查看返回到浏览器的页面

def self.search(params)
  raise params[:fc].inspect
如果这是您认为的数组,那么您的where方法应该是:

where('facilities_hotels.facility_id in (:fc_list)', :fc_list => params[:fc])

作为编码技巧,考虑以下代码是否更干净。

def self.search(params)
  if params && params[:fc].present?
    joins('INNER JOIN facilities_hotels ON hotels.id=facilities_hotels.hotel_id ').
      where('facilities_hotels.facility_id in (:fc_list)', :fc_list => params[:fc])
  else
    Hotel
  end
end

您是否检查了开发日志中生成的查询,查看sql查询是否正确?在您的代码之前,仅使用一个复选框,我的代码已执行,但返回nil。当我选中两个或更多框时,它崩溃了。现在它起作用了,从一件事来看。如果我选中两个复选框,所有酒店都会出现。有那一套设施的和有那两套设施的。我只想让它显示那些同时拥有两个选定设施的设备。有什么帮助吗?(如果我将“in”改为“=”,它将不起作用,因为它只需要一个参数,如果我选中两个框,我将传递两个参数)这是一个很大的骗局。这可能需要一些思考,我可能会想出更好的解决方案,但马上,你可能会做一个小组(“hotels.id”),并拥有(“count(facility_id)=:count”,“count=>params[:fc].size”)只是想让你知道你的解决方案是有效的,只需要添加一个新的查询和一些小问题。非常感谢马林·皮尔斯:)
def self.search(params)
  if params && params[:fc].present?
    joins('INNER JOIN facilities_hotels ON hotels.id=facilities_hotels.hotel_id ').
      where('facilities_hotels.facility_id in (:fc_list)', :fc_list => params[:fc])
  else
    Hotel
  end
end