将"ActiveRecord::Relation"对象作为方法参数传递是一种正确/不危险/常见的方法吗?



我正在使用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则根本不会命中数据库)。

注意 II:如果我将Array而不是ActiveRecord::Relation作为参数值传递associationpluck方法的使用可能会产生错误。

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

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

module Enumerable 
  def pluck(method, *args) 
    map { |x| x.send(method, *args) } 
  end 
end

相关内容

最新更新