2016-07-25 183 views
0

我正在学习如何使用ransack,所以我有一个问题,我不确定它是否因为快速搜索或者是因为数组。Rails Ransack - 从数组中删除元素

我有一个带有2个文本字段的表单(:search:discipline)。所以我正在尝试使用1º场参数AND进行2º场参数搜索。

的想法是寻找那来自1º参数(场:search所有元素,然后删除所有来自2º参数(场:discipline)不同的元素。

class PagesController < ApplicationController 
    def home 
    @rooms = Room.limit(6) 
    end 

    def search 

    if params[:search].present? && params[:search].strip != "" 
     session[:loc_search] = params[:search] 
    end 

    if params[:discipline].present? && params[:discipline].strip != "" 
     session[:loc_discipline] = params[:discipline] 
    end 

    arrResult = Array.new 

    if session[:loc_search] && session[:loc_search] != "" 
     @rooms_address = Room.where(active: true).near(session[:loc_search], 5, order: 'distance')  
    else 
     @rooms_address = Room.where(active: true).all 
    end 

    @search = @rooms_address.ransack(params[:q]) 
    @rooms = @search.result 

    @arrRooms = @rooms.to_a 


    if (session[:loc_discipline] && !session[:loc_discipline].empty?) 

     @rooms.each do |room| 

     not_available = Room.where(
      "(room_type != ?)", 
      session[:loc_discipline] 
     ) 

     if not_available.length > 0   
      @arrRooms.delete(room) 
     end 
     end 
    end  
    end 
end 

@arrRooms正在恢复NULL后我尝试做到这一点@arrRooms.delete(room) 我不知道是否有更好的方式来做到这一点,但我试图做它像一个教程,我发现

回答

1

我假设你试图显示所有房间那是不是可用?

我认为最好的策略是加载你真正想要的东西,而不是加载所有东西然后删除你不需要的东西。您的代码是真的很难读,我建议你把一个小教程是这样的:http://tryruby.org/levels/1/challenges/0,或者这样:https://www.codeschool.com/courses/ruby-bits

尝试提取像where(active: true)代码到像一个范围:

class Room < ActiveRecord::Base 
    scope :active, -> { where(active: true) } 
    scope :available, -> (discipline) { where.not(room_type: discipline) } 
end 

在你的控制器,你可以然后使这个:

def index 
    @rooms = Room.active.available(params[:discipline]) 
    search_param = params[:search].present? 
    if search_param.present? 
    @rooms = @rooms.near(session[:loc_search], 5, order: 'distance') 
    end 
    @rooms = @rooms.ransack(params[:q]).result(distinct: true) 
end 

这是我可以猜出你的代码。