在 Rails 3.2 模型中,希望创建一个“to_csv”类方法来从 ActiveRecord 范围生成 CSV 输出,如下所示:
class Post
# ...
def self.to_csv(options = {})
CSV.generate(options) do |csv|
scoped.each {|post| csv << record.attributes.values_at('title', 'text')}
end
end
end
我希望我可以像这样使用它:
User.first.posts.to_csv
但是,该方法似乎被 Array #to_csv 方法覆盖。即使我这样做:
User.first.posts.scoped.to_csv
...并且来自User.first.posts.scoped的结果明确是一个 ActiveRecord::Relation,我仍然点击了 Array 方法。如果我将该方法重命名为“to_csvx”之类的名称,它会按预期工作。
我希望有人可以解释 ActiveRecord::Relation 对象如何/为什么优先命中 Array #to_csv 方法而不是 to_csv 类方法。虽然这(一个期望被 AR 范围调用的类方法)似乎是合理的,但我想知道整个想法是否存在固有问题?