迭代数组,调整虚拟属性并返回具有调整值的数组

时间:2016-01-05 19:37:47

标签: ruby-on-rails ruby

我有一个名为tag的rails类:

class Tag < ActiveRecord::Base
  attr_accessor :is_enabled_on_item # a virtual attribute for ouptutting json

我想调整is_enabled_on_item,如下所示:

t.each { |tmp| tmp.is_enabled_on_item=true if current_tag_ids.include?(tmp.tagid) }

得到:

[
   {
      tagid:1,
      phrase: "blue",
      is_enabled_on_item: true 
   },
   {
      tagid:2,
      phrase: "yellow",
      is_enabled_on_item: false 
   }
]

我试过收集

t.collect { |tmp| tmp.is_enabled_on_item=true if current_tag_ids.include?(tmp.tagid) }

但它回归[true, false]。我怎样才能达到我想要的目标?

编辑#1

我希望它返回一个标签数组。

这样的事情可行,但中间人arr似乎没必要:

arr=[]
t.each do |tmp| 
  tmp.is_enabled_on_item=current_tag_ids.include?(tmp.tagid)
  arr << tmp
end  
arr

2 个答案:

答案 0 :(得分:2)

t.map do |tmp|
  tmp.attributes.merge(is_enabled_on_item: current_tag_ids.include?(tmp.tagid))
end

答案 1 :(得分:1)

你对收集的看法几乎是正确的,试试这个:

t.collect { |tmp| tmp.is_enabled_on_item=current_tag_ids.include?(tmp.tagid); tmp }

请注意,赋值返回指定的值,而您必须在块中返回标记才能收集标记。

向前迈出一步并使用更多规范的方法和参数名称会很好:

tags.map { |tag| tag.is_enabled_on_item=current_tag_ids.include?(tag.tagid); tag }