Ruby on rails 将“ActiveRecord::Relation”对象作为方法参数传递是否是正确/不危险/常见的方法?

Ruby on rails 将“ActiveRecord::Relation”对象作为方法参数传递是否是正确/不危险/常见的方法?,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,methods,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Methods,我使用的是RubyonRails3.2.2,我想知道将ActiveRecord::Relation对象作为方法参数传递是否正确/不危险/通用 目前,我正计划以这种方式在我的模型的范围方法中使用这种方法: class Article < ActiveRecord::Base def self.with_active_associations(associations, active = nil) # associations.class # => ActiveRec

我使用的是RubyonRails3.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是延迟加载的,如果活动参数值不是活动的,则根本不会命中数据库


注二:如果我将数组而不是ActiveRecord::Relation作为关联参数值传递,则使用Pull方法可能会产生错误。

1在我看来,这是一个合理的折衷,您失去了将数组作为参数发送的能力,但获得了一些性能。这并不奇怪;例如,每次定义一个作用域时,过滤器都只作用于关系而不作用于数组

2您始终可以添加Enumerablepluck,以便该方法透明地处理数组。当然,如果您使用关系的更多特性,它将不起作用

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

我找不到使用和/或解释这种将ActiveRecord::Relation作为方法参数传递的方法的示例或博客文章。如果你知道和/或能找到一个,你能链接其中的某个人吗?我不知道有博客对此发表评论,但对我来说似乎没什么大不了的。。。