我正在尝试在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"
)
如果我没有非常清楚地解释这个问题,我会根据评论更新我的问题。
答案 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返回一个枚举器。