搜索参数的重复结果

时间:2016-07-07 18:49:37

标签: ruby-on-rails ruby web-deployment

我有一个搜索方法和两个模型,餐馆和菜单。在菜单搜索方法中,如果我搜索“鸡肉”,它会显示附近出售餐点的最近的餐馆,例如鸡肉三明治“鸡肉三明治”使用协会。问题是,如果一家餐馆出售多份鸡肉饭,餐厅会多次呈现。我希望能够一次显示餐馆,当点击按钮时,一个模态显示用名称中的“鸡”用餐,如果有的话与鸡肉多餐。我尝试添加uniq& ActiveRecord中的uniq(&:restaurant_id)以及控制器&还尝试使用sql“DISTINCT”,但没有。

Example of problem

控制器

def search_for_menus
    #@restaurant= Menu.restaurant.all
    @menus = Menu.search_for_menus(params)
  end

菜单模型

belongs_to :restaurant
  reverse_geocoded_by "restaurants.latitude", "restaurants.longitude"

  def self.search_for_menus(params)

    menus=Menu.where("dish LIKE ?", "%#{params[:dish]}%") if params[:dish].present?
    menus = menus.where("menus.price <=?",params[:max ])
    menus = menus.where("menus.price >=?",params[:min ])

    menus= menus.joins(:restaurant).near(params[:location],2)

   menus  
  end
end

搜索页面HTML

    <% if @menus.present? %>
<%@menus.each do |menu| %>
    <br>
    <br>


<div id ="restaurants">
    <div class="box">
      <div class="thumbnail box-image">

            <%= link_to (image_tag (menu.restaurant.thumbnail.url(:medium))),restaurant_path(menu.restaurant),'data-no-turbolink' => true%>  

      <div class="caption">
        <h3 class="text-center"><%=menu.restaurant.name%></h3>

        <p class="text-center"><a href="#" class="btn btn-primary text-center" role="button" data-toggle="modal" data-target="#modal-<%= menu.id %>">View Food</a></p>
      </div>
    </div>

          </div>

<div id="modal-<%= menu.id %>" class="modal fade bs-example-modal-sm" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
    <div class="modal-body">
    <div class="col-md-6">
      <p><%= menu.dish %></p>
      </div>
      <div class="col-md-6">
      <p><%= menu.price %></p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">OK</button>

      </div>
    </div>
  </div>
</div>
</div>



<%end%>



</div>




<%else%>

<p>no posts</p>

<%end%>

2 个答案:

答案 0 :(得分:2)

我认为,您需要开始的是存在匹配菜单项的餐馆。

restaurants = Restaurant.near(params[:location],2).
                         where(Menu.where("menus.restaurant_id = restaurants.id").
                                    where("dish LIKE ?", "%#{params[:dish]}%").
                                    where("menus.price <=?",params[:max ]).
                                    where("menus.price >=?",params[:min ]).exists)

每个餐厅保证返回一行。

如果您的RDBMS支持,您可能希望ILIKE进行不区分大小写的搜索。

然后,您可以列出匹配餐厅的相应菜单项。

答案 1 :(得分:0)

在讨论了聊天之后,这里有一个更新,感谢@David的查询。

菜单型号:

  belongs_to :restaurant
  reverse_geocoded_by "restaurants.latitude", "restaurants.longitude"

  def self.search_for_restaurants(params)
    Restaurant.near(params[:location],2).
                         where(Menu.where("dish LIKE ?", "%#{params[:dish]}%").
                                    where("menus.price <=?",params[:max ])
                                    where("menus.price >=?",params[:min ]).exists)
  end

把它放在餐厅模型中(这里你将获取视图的所有匹配菜单):

def search_for_matching_menus dish
  menus.where("dish LIKE ?", "%#{dish}%")
end

查看(你必须根据自己的需要调整它,我只是想让你理解这个想法):

<% if @restaurants.present? %>
  <%@restaurants.each do |restaurant| %>
    <br></br>
    <br></br>
    <div id ="restaurants">
      <div class="box">
        <div class="thumbnail box-image">
          <%= link_to (image_tag (restaurant.thumbnail.url(:medium))),restaurant_path(restaurant),'data-no-turbolink' => true%>  
          <div class="caption">
            <h3 class="text-center"><%=restaurant.name%></h3>
            <%= restaurant.search_for_matching_menus(@dish).each do |menu| %>
              <%= menu.id %>
            <% end %>
          </div>
        </div>
      </div>
  <%end%>
<%end%>

最后,这必须在调用搜索的控制器上进行,以转发dish参数:

@dish = params[:dish]