Rails循环变量

时间:2017-03-08 20:07:19

标签: ruby-on-rails ruby

我有以下developers_controller,我想根据location_params执行查询。

index_update操作中,我使用用户提供的location创建变量location_params作为研究的输入。我想对此变量执行each循环,以根据用户请求过滤@locations = Location.all的数据。

这是我的私人方法location_params

def location_params
  params.require(:location).permit(:country, :location, :surfspot, :barbecue, :villa, :swimmingpool, :skiresort, :singleroom )
end

这是我的index_update行动:

def index_update
  location = Location.new(location_params)
  locations = Location.all
  location.each do |param, value|
    if value != nil
      locations = locations.where(param => value)
    end
  end
end

我无法找到如何循环location变量。

这是我在Rails控制台中的位置模型:

=> #<Location:0x000000036b6838
 id: nil,
 host_id: nil,
 description: nil,
 location: nil,
 singleroom: nil,
 sharedroom: nil,
 surfspot: nil,
 barbecue: nil,
 villa: nil,
 swimmingpool: nil,
 skiresort: nil,
 created_at: nil,
 updated_at: nil,
 country: nil,
 state: nil,
 houseimages: nil

2 个答案:

答案 0 :(得分:1)

我会这样做只在查询中使用带有当前值的参数:

def index_update
  query_attributes = location_params.select { |_, v| v.present? }
  locations = Location.where(query_attributes)
end

或者:

def index_update
  query_attributes = location_params.reject { |_, v| v.blank? }
  locations = Location.where(query_attributes)
end

答案 1 :(得分:0)

如果您location_params可以实例化一个新位置,那么它们可能已经成为传递到where的正确格式:

def index_update
  locations = Location.where(location_params)
end

如果您需要从参数中删除nil值:

def index_update
  locations = Location.where(location_params.delete_if { |k,v| v.nil? })
end