0

我是 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>

我的酒店和设施与一切正常运转有着密切的关系。facility_hotels 表是使用 facility_id 和 hotel_id 列创建的,设施表中的列有 facility_id 和描述(例如游泳池、24hroom 服务等)

问题出在我的模型中:

def self.search(params)

     if params
           arel = where('#searches for names/location/rating')

        if params[:fc].present?
          arel=arel.joins('INNER JOIN facilities_hotels ON hotels.id=facilities_hotels.hotel_id ')

          for i in params[:fc].size
            arel=arel.where('facilities_hotels.facility_id = ?', params([:fc][i])) 
                #how do I increment on the previous line? Obviously params([:fc][i]) does not work
          end
          arel
        else
           arel
        end


     else
       all
     end

我不想用 to_sql 做这个......

此外,当我运行它时,如果我选中设施复选框,查询总是返回空结果,但这可能是我模型中那行代码的问题,但如果你预见到问题,我会很感激与此问题相关的未来代码冲突

先感谢您

4

1 回答 1

2

这是您的问题,链接 where 将 where 条件与“ AND ”合并。检查你的 development.log 文件,或者 test.log 如果你正在做 TDD(你应该这样做)。这将生成 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
于 2012-04-23T18:53:18.987 回答