Ruby on rails 与if语句相比,对变量进行多次检查的数据结构更好?
所以,我有这段代码,是的,它看起来很难看。是否有更好的数据结构可以用来比较row.add、row.modify、row.delete和row.query与“Y”并调用get\u角色函数?请注意,这段代码在循环中运行,因此是“行”Ruby on rails 与if语句相比,对变量进行多次检查的数据结构更好?,ruby-on-rails,ruby,data-structures,Ruby On Rails,Ruby,Data Structures,所以,我有这段代码,是的,它看起来很难看。是否有更好的数据结构可以用来比较row.add、row.modify、row.delete和row.query与“Y”并调用get\u角色函数?请注意,这段代码在循环中运行,因此是“行” if row.add == "y" role_ids << get_role("c") end if row.modify == "y" role_ids << get_role("u")
if row.add == "y"
role_ids << get_role("c")
end
if row.modify == "y"
role_ids << get_role("u")
end
if row.delete == "y"
role_ids << get_role("d")
end
if row.query == "y"
role_ids << get_role("r")
end
如果row.add==“y”
角色ID角色ID更新
改为
operations = [row.add,row.modify,row.delete,row.query]
crud=["c","u","d","r"]
operations.each_with_index{|operation,i| if operation == "y" then role_ids << get_role(crud[i]) end}
operations=[row.add,row.modify,row.delete,row.query]
积垢=[“c”、“u”、“d”、“r”]
操作。每个带有{u索引的{u操作,i |如果操作==“y”,则角色{u idoperations={:add=>“c”,:modify=>“u”,:delete=>“d”,:query=>“r”}
操作。每个do |键、值|
角色ID总是会触发get\u role(“y”)
。正确的跟踪,但不完全正确。感谢Jeriko的提醒。我认为现在更改的版本可以工作了。这个解决方案确实不可读。它还引入了额外的变量,需要创建更多的对象。当您调用row.send(:method\u name)时
,这与调用行.method\u name
相同。这是必需的,因为您的操作/方法名称存储在一个数组中(因为它们需要相应的值)。例如,object.delete
和object.send(:delete)
是相同的。这有助于解释吗?是的,我想,这就是我删除注释的原因。谢谢!这种技术称为动态分派。只是一个小小的注释:在1.9之前,Ruby的哈希没有排序,因此不能保证这里的每个都会以定义的相同顺序遍历哈希。如果顺序很重要,就用一个应该使用数组数组(对)而不是散列,不需要更改所需的每个调用。
operations = [row.add,row.modify,row.delete,row.query]
crud=["c","u","d","r"]
operations.each_with_index{|operation,i| if operation == "y" then role_ids << get_role(crud[i]) end}
operations = { :add => "c", :modify => "u", :delete => "d", :query => "r" }
operations.each do |key,value|
role_ids << get_role(value) if row.send(key) == "y"
end