Rails Ransack - 从数组中删除元素

Rails Ransack - removing element from array

我正在学习如何使用 ransack,所以我遇到了一个问题,我不确定是因为 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 在我尝试这样做 @arrRooms.delete(room) 后返回 NULL。 我不知道是否有更好的方法来做到这一点,但我正在尝试按照我找到的教程来做。

我假设您要显示所有可用的房间?

我认为最好的策略是加载你真正想要的东西,而不是加载所有东西然后删除你不需要的东西。你的代码真的很难读,我建议你学习这样的小教程:http://tryruby.org/levels/1/challenges/0, or this: 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

这是我从你的代码中猜到的。