1

我正在使用 Ruby on Rails 3.2.2,我想知道将ActiveRecord::Relation对象作为方法参数传递是否是正确/不危险/常见的方法。

目前,我计划以这种方式在我的模型的范围方法中使用这种方法:

class Article < ActiveRecord::Base
  def self.with_active_associations(associations, active = nil)
    # associations.class
    # => ActiveRecord::Relation

    case active
    when nil
      scoped
    when 'active'
      with_ids(associations.pluck(:associated_id))
    when 'not_active'
      ...
    else
      ...
    end
  end
end

注意 I:出于性能原因,我想使用这种方法,因为它ActiveRecord::Relation是延迟加载的(在我的情况下,如果active参数值不是active数据库,则根本不会命中)。

注二:如果我作为参数值传递 an而不是 an ,则该pluck方法的使用可能会产生错误。associationArrayActiveRecord::Relation

4

1 回答 1

0

1)在我看来,这是一个合理的权衡,你失去了发送数组作为参数的能力,但你获得了一些性能。这并不奇怪。例如,每次定义范围时,您都在这样做,过滤器仅适用于关系而不适用于数组。

2)您可以随时添加Enumerable#pluck,以便该方法对数组透明地工作。当然,如果您使用更多的关系功能,它将无法正常工作。

module Enumerable 
  def pluck(method, *args) 
    map { |x| x.send(method, *args) } 
  end 
end
于 2012-06-08T21:08:07.343 回答