我正在使用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
作为参数值传递association
则pluck
方法的使用可能会产生错误。
1)在我看来,这是一个合理的权衡,你失去了发送数组作为参数的能力,但你获得了一些性能。这并不奇怪;例如,每次定义范围时,您都在这样做,过滤器仅适用于关系而不是数组。
2) 您可以随时添加Enumerable#pluck
以便该方法透明地处理数组。当然,如果您使用更多的关系功能,它将不起作用。
module Enumerable
def pluck(method, *args)
map { |x| x.send(method, *args) }
end
end