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
这是我从你的代码中猜到的。
我正在学习如何使用 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
这是我从你的代码中猜到的。