0

我正在尝试在 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"
      )

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

4

5 回答 5

2

您可能只想这样做:

children = Child.all
Parent.do_something(
  attribute: "a string",
  parameter: "a string",
  child: children.map { |child| child.url }
)
于 2013-04-23T04:07:54.083 回答
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
于 2013-04-23T03:56:33.103 回答
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 的答案漂亮的平面地图要漂亮得多。

于 2013-04-23T07:10:25.203 回答
1

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

于 2013-04-23T11:57:24.893 回答
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 返回一个 Enumerator 的事实。

于 2013-04-23T09:13:29.403 回答