【问题标题】:Rails Ransack - removing element from arrayRails Ransack - 从数组中删除元素
【发布时间】:2016-07-25 02:13:51
【问题描述】:

我正在学习如何使用 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。 我不知道是否有更好的方法来做到这一点,但我正在尝试像我找到的教程那样做。

【问题讨论】:

    标签: ruby-on-rails arrays sqlite ransack


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2022-11-23
      • 2011-10-31
      • 1970-01-01
      • 2022-01-13
      • 2016-03-08
      • 2017-09-13
      • 2017-12-22
      相关资源
      最近更新 更多