0

@data, @x, @y, 和@z都是相同类型的数组。我在视图中使用@data 来遍历它并显示所有值。

  @data = if params[:a] == "1"
    @x
  elsif params[:b] == "1"
    @y 
  elsif params[:c] == "1"
    @z

如果应用了多个参数,我想做的也是与数组相交。因此,例如,如果?a=1&b=2附加到 URL,那么我想@data等于@x & @y

我不确定如何编写这段代码——找出哪些参数 == 1 然后与相应的数组相交并将其存储在@data 中的最简单方法是什么?

4

2 回答 2

3

幸运的是,Ruby 让这一切变得简单!

@data = [params[:a] && @x, params[:b] && @y, params[:c] && @z].compact.inject(:&)

这构造了一个数组(如果参数存在;您可以检查== '1'是否要更具体)或 nils(如果不存在)。compact然后将 nils 从数组中删除,然后我们可以通过调用来与剩余的值相交inject(:&)

inject调用遍历您的值数组,获取第一个值,然后将&下一个值作为参数应用该方法。然后它获取结果并&与第三个参数一起应用,依此类推,产生一个最终值,它是传递数组中所有数组的交集。

于 2012-12-11T00:12:18.543 回答
1

那这个呢

key_to_array = {:a => @x, :b => @y, :c => @z}

@data = key_to_array.select { |k, _| params[k] == '1' }.values.inject(&:&)

※ 不适用于 Ruby 1.8

于 2012-12-11T00:11:05.063 回答