Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 搜索Ruby数组_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 搜索Ruby数组

Ruby on rails 搜索Ruby数组,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我正在构建一个Ruby数组,用于分组选择框,如下所示 def self.actions actions = [] status_actions = [] priority_actions = [] user_actions = [] for status in Choice.ticket_statuses status_actions << ["Set ticket status to [#{status.name}]","ticket.status_id =

我正在构建一个Ruby数组,用于分组选择框,如下所示

def self.actions
  actions = []
  status_actions = []
  priority_actions = []
  user_actions = []

for status in Choice.ticket_statuses
  status_actions << ["Set ticket status to [#{status.name}]","ticket.status_id = #{status.id}"]
end

for priority in Choice.ticket_priorities
  priority_actions << ["Set ticket priority to [#{priority.name}]","ticket.priority_id = #{priority.id}"]
end

for user in User.all
  user_actions << ["Set owner to [#{user.name}]","ticket.user_id = #{user.id}"]
end

actions << ["Status", status_actions]
actions << ["Priority", priority_actions]
actions << ["User", user_actions]

return actions
end
现在我需要一种方法来搜索这个数组中的一个值,如ticket.status\u id=7,并返回名称,如Set ticket status to[Closed]

e、 g

所以我可以打电话给你

return_name("ticket.status_id = 7")
> "Set ticket status to [Closed]"
我当前的return_name函数尽管非常混乱,但只搜索数组的状态部分

您可以使用递归:

def return_name(arr, value)
  if arr.is_a? Array
    return arr.first if value == arr.last
    arr.map { |i| return_name(i, value) }.compact.first
  end
end

return_name(arr, 'ticket.priority_id = 4')
# => "Set ticket priority to [Medium]" 
此代码的作用是:

除非arr是数组,否则返回nil。 如果最后一个值等于要查找的值,则返回数组的第一个值 否则,它会在其所有子级上递归,以找到第一个匹配的子级。
递归意味着为所有it项目调用自己-它检查是否有任何子项可以通过问相同的问题来回答您的问题

以下是一些非递归的方法:

def return_name(search_term)
  # a flattened array will alywas have the value you are searching for jsut before the search term, so just get the index before that.
  temp_array = @data.flatten
  ix = temp_array.index(search_term)
  ix ? temp_array[ix-1] : nil
end

  # some more Ruby magic.
p @data.map(&:last).flatten(1).rassoc("ticket.user_id = 1") #=> ["Set owner to [UNLOCK-DEV]", "ticket.user_id = 1"]

您可以采取的一种方法是将数组转换为字符串,然后使用正则表达式搜索字符串

代码

例子

都要吗


我得说你的数据流没有经过深思熟虑。向用户发送SQL片段是一个非常糟糕的主意。相反,有一个选择框状态返回值6,7。。。仅在参数状态_id中。提交selectbox后,从参数名称和值生成SQL和响应文本。除非通过分组选择框,否则您的意思是您只需要一个选择,并且选择框下有optgroups;然后,我用一个简单的分隔符(如status,1)分隔列名和值,并在接收操作中将其拆分,再次使用case语句或其他方法从片段中构建查询和文本响应,以验证该列确实是您在该操作中允许的,而不是鲍比在桌子上玩。谢谢你的想法。我可能会在将来重构它,但当前需要的是搜索这个嵌套数组。是的,这就是为什么它是一个注释而不是一个答案。谢谢你-我刚刚通过并删除了SQL片段,并替换为status,1等,以使它更容易。现在我只需要找出如何展平这个数组来搜索它!谢谢您的想法。@user3565039不知道代码是如何工作的,不要使用。问Uri,你的理解问题,他会解释你。Uri是一个很酷的红宝石爱好者。谢谢Arup-我会把它拆开并弄清楚它是如何工作的-这样我会学到更多,谢谢。
def return_name(arr, value)
  if arr.is_a? Array
    return arr.first if value == arr.last
    arr.map { |i| return_name(i, value) }.compact.first
  end
end

return_name(arr, 'ticket.priority_id = 4')
# => "Set ticket priority to [Medium]" 
def return_name(search_term)
  # a flattened array will alywas have the value you are searching for jsut before the search term, so just get the index before that.
  temp_array = @data.flatten
  ix = temp_array.index(search_term)
  ix ? temp_array[ix-1] : nil
end

  # some more Ruby magic.
p @data.map(&:last).flatten(1).rassoc("ticket.user_id = 1") #=> ["Set owner to [UNLOCK-DEV]", "ticket.user_id = 1"]
def return_name(arr, str)
  arr.to_s[/\"(Set ticket [a-z]+ to \[[\w\s]+\])\",\s+\"#{str}\"/,1]
end
arr = [
  ["Status", 
    [["Set ticket status to [Closed]", "ticket.status_id = 7"], 
     ["Set ticket status to [Open]", "ticket.status_id = 6"], 
     ["Set ticket status to [Waiting 3rd Party]", "ticket.status_id = 8"], 
     ["Set ticket status to [Waiting on Client]", "ticket.status_id = 9"]
    ]
  ], 
  ["Priority", 
    [["Set ticket priority to [High]", "ticket.priority_id = 5"], 
     ["Set ticket priority to [Low]", "ticket.priority_id = 3"], 
     ["Set ticket priority to [Medium]", "ticket.priority_id = 4"]]
  ], 
  ["User", 
    [["Set owner to [UNLOCK-DEV]", "ticket.user_id = 1"]]
  ]
]

return_name(arr, "ticket.status_id = 7")
  #=>  "Set ticket status to [Closed]"
return_name(arr, "ticket.status_id = 6")
  #=> "Set ticket status to [Open]"
return_name(arr, "ticket.status_id = 8")
  #=> "Set ticket status to [Waiting 3rd Party]"
return_name(arr, "ticket.status_id = 9")
  #=> "Set ticket status to [Waiting on Client]"

return_name(arr, "ticket.priority_id = 5")
  #=> "Set ticket priority to [High]"
return_name(arr, "ticket.priority_id = 3")
  #=> "Set ticket priority to [Low]"
return_name(arr, "ticket.priority_id = 4")
  #=> "Set ticket priority to [Medium]"
r = /(Set ticket [a-z]+ to \[[\w\s]+\])(?:\",\s+\")(ticket\.[a-z]+_id = \d+)/
arr.to_s.scan(r).map(&:reverse).to_h
  #=> {"ticket.status_id = 7"  =>"Set ticket status to [Closed]",
  #    "ticket.status_id = 6"  =>"Set ticket status to [Open]",
  #    "ticket.status_id = 8"  =>"Set ticket status to [Waiting 3rd Party]",
  #    "ticket.status_id = 9"  =>"Set ticket status to [Waiting on Client]",
  #    "ticket.priority_id = 5"=>"Set ticket priority to [High]",
  #    "ticket.priority_id = 3"=>"Set ticket priority to [Low]",
  #    "ticket.priority_id = 4"=>"Set ticket priority to [Medium]"}