1
class A
  attr_accessor :dab
  ....
end

现在我有一个 A 的实例数组,比如说

arr = [A.new, A.new, A.new]

现在我想为A数组中存在的所有类实例设置一个值arr。ruby/rails 中有没有捷径可以做到这一点?

此外,我确实A继承自ActiveRecord::Base

而我的实际需要是:

A.find_all_by_some_condition.all.dabs = 2

因此,所有找到的对象都将dab设置为 2。

这有捷径吗?

4

2 回答 2

1

要从数组中获取 A 类的项目,您可以使用 select/find_all

arr.select { |el| el.class == A }或者arr.select { |el| A === el }

尽管您希望为多个对象而不是它们对应的类分配一个值,但要实现您的实际结果。A 类没有定义实际的对象,它只是定义了对象在创建时使用的蓝图。因此,找到一种方法来分配 A 的所有实例的值并不是您所追求的(尽管我可能错过了您所要求的重点)

要将值分配给对象数组,这是可行的:

A.find_all_by_some_condition.each { |a| a.dab = 2 }

也许你想在那之后保存它们,现在arr.each(&:save)可能会派上用场。如果你还不知道的话,去查一下 & 号。很有用。

于 2012-06-16T10:43:53.813 回答
0

默认情况下你不能直接这样做,但是你可以使用 Ruby 的method_missing.

两种解决方案:

解决方案 1 - 使用包装类

我们将这个类称为MArray多分配数组。

class MArray
  def initialize(inner_array)
    @inner = inner_array
  end

  def method_missing(meth, value)
    # Check if assignement, and if it is then run mass-assign
    if meth.to_s =~ /^\w+=$/
      @inner.each { |itm| itm.send(meth, value) }
    else
      raise ArgumentError, "MArray: not an assignment"
    end
  end
end

我们还需要添加对MArrayin的支持Array,以便进行包装。我们将调用mas“质量分配”的方法:

class Array
  def mas
    # Wrap MArray around self
    MArray.new(self)
  end
end

用法很简单:

Blob = Struct.new(:dab)
arr = [Blob.new] * 3
arr.mas.dab = 123
arr
=> [#<struct Blob dab=123>, #<struct Blob dab=123>, #<struct Blob dab=123>]

解决方案 2 - 直接创建批量分配支持Array

这有点“危险”,因为我们直接method_missingArray. 它可能会产生一些奇怪的副作用(例如,如果method_missing已经被其他库重新定义,或者您无意中调用了质量分配)。

它的工作原理是尝试检测带有复数词(以 结尾的词s)的赋值,然后触发批量赋值:

class Array
  def method_missing(meth, *args, &block)
    # Check for plural assignment, and as an added safety check also
    # see if all elements in the array support the assignment:
    if meth.to_s =~ /^(\w+)s=$/ && 
       self.all? { |itm| itm.respond_to?("#{$1}=") }
      self.each { |itm| itm.send("#{$1}=", *args) }
    else
      super
    end
  end
end

然后使用变得比 with 更短MArray

Blob = Struct.new(:dab)
arr = [Blob.new] * 3
arr.dabs = 123
arr
=> [#<struct Blob dab=123>, #<struct Blob dab=123>, #<struct Blob dab=123>]
于 2012-06-16T13:38:09.653 回答