2016-07-25 29 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私はこの@arrRooms.delete(room)を行うみてください後。 私はこれを行うには良い方法を持っている場合は知らないが、私は私が見つけたのチュートリアルのようにそれを行うしようとしている。

答えて

1

私はあなたがすべての部屋を表示しようとしていることを前提とNULLそれはですはありませんか?

ベストプラクティスは、本当に必要なものをロードし、すべてをロードせずに必要のないものを削除することです。あなたのコードが読み本当に難しいですが、私はあなたがこのように少しチュートリアルを取るお勧め:http://tryruby.org/levels/1/challenges/0、またはこの:あなたができるお使いのコントローラで

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

https://www.codeschool.com/courses/ruby-bits

のようなスコープにwhere(active: true)のようなコードを抽出してみ

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 

これは私があなたのコードから推測できるものです。

関連する問題