【问题标题】:Ruby on Rails - Arrays, search and returnRuby on Rails - 数组、搜索和返回
【发布时间】:2012-04-23 18:25:47
【问题描述】:

我是 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 和描述(例如游泳池、24 小时服务等)

问题出在我的模型中:

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 做这个...

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

提前谢谢你

【问题讨论】:

  • 有没有查看开发日志中生成的查询,看sql查询是否正确?

标签: ruby-on-rails arrays where-clause where increment


【解决方案1】:

这是您的问题,链接 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

【讨论】:

  • 在您的代码之前并且只有一个复选框,我的代码已执行,但返回 nil。当我检查 2 个或更多框时,它崩溃了。现在它起作用了,除了一件事。如果我选中 2 个复选框,则会出现所有酒店。拥有那一种设施的和拥有那两种设施的。而且我只希望它显示那些同时具有所选设施的人。有什么帮助吗? (如果我将 'in' 更改为 '=' 它将不起作用,因为它只需要一个参数,如果我选中两个框,我将传递两个)
  • 这很狡猾。这需要一些思考,我可能会想出更好的东西,但是你可能会做一个 group("hotels.id"), and having("count(facility_id) = :count", :count => params[ :fc].size)
  • 只是想让您知道您的解决方案有效,只需要适应新的查询和较小的 tweeks。非常感谢马林皮尔斯 :)
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2012-07-21
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多