如何在方法中循环?

时间:2013-04-23 03:52:23

标签: ruby-on-rails ruby

我正在尝试在Rails应用程序中的方法中添加循环。它看起来像这样

Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  child[0]: "child_url"
  )

有时父母没有孩子。有时父母会有x个孩子。如何在一个循环遍历所有这些孩子的函数中创建一个循环。

我想要像

这样的东西
i=0
children=Child.all
Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  for child in children
   child[i]: "child_url"
   i= i + 1
  end
  )

那将生成

Parent.do_something(
      attribute: "a string",
      parameter: "a string",
      child[0]: "child_0_url",
      child[1]: "child_1_url",
      child[2]: "child_2_url"
      )

如果我没有非常清楚地解释这个问题,我会根据评论更新我的问题。

5 个答案:

答案 0 :(得分:2)

您可能只想这样做:

children = Child.all
Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  child: children.map { |child| child.url }
)

答案 1 :(得分:1)

可能更容易将该部分提取到不同的方法中:

Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  children: children_method
)

def children_method
  Parent.children.map do |child|
     # whatever needs to be done
  end
end

答案 2 :(得分:1)

正如其他人所建议的那样,重新设计你的方法以期望一组孩子,而不是很多单个参数可能会更好:

Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  children: ["child_0_url", "child_1_url", "child_2_url"]
  )

但是,如果你的方式按照你所说的方式去做(例如,如果你受到其他人糟糕的API的限制):

children = Child.all
Parent.do_something(
  {attribute: "a string",
   parameter: "a string"}.merge Hash[*(children.each_with_index.map { |child, i| ["child[#{i}]", child.url] }.flatten)]
)

丑陋,是吗?

俗话说;如果这很难做,你可能做错了。 Ismael Abreu答案的漂亮平面地图更漂亮。

答案 3 :(得分:1)

如果您尝试将可变数量的参数传递给方法,那么您可能正在寻找splat (*) operator

答案 4 :(得分:0)

如果您想要输入您输入的网址,请尝试以下操作:

children = Child.all
Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  child: something
)

def something
  child = []
  children.length.times { |index| child << "child_#{index}_url"}
  return child
end

如果你不需要其他地方的孩子,你也可以用Child.count替换children.length,但我假设你这样做。

编辑:我认为这可能更多您正在寻找

children = Child.all
Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  child: children.each_with_index.map { |child,i| "child_#{i}_#{child.url}"}
)

这利用了如果没有给出块,则each_with_index返回一个枚举器。