ruby-on-rails - 如何使方法应用于 ActiveRecord 对象的集合

标签 ruby-on-rails ruby

目前,如果我想将一个方法应用于一组 ActiveRecord 对象,我必须像这样构建调用:

messages = Message.find(:all)
csv = Message.to_csv(messages)

如何定义方法,使其结构如此?

messages = Message.find(:all)
csv = messages.to_csv

这是当前模型代码:

require 'fastercsv'
class Message < ActiveRecord::Base
  def Message.to_csv(messages)
    FasterCSV.generate do |csv|
      csv << ["from","to", "received"]
      for m in messages
        csv << [m.from,m.to,m.created_at]
      end
    end
  end
end

最佳答案

以下将在消息数组中包含的所有实例上调用 to_csv。

messages = Message.find(:all)
csv = messages.map { |message| message.to_csv }

在 Rails 中,在 Ruby 1.9 中或通过其他方式使用 Symbol#to_proc 时,您还可以将其缩短为:

csv = messages.map(&:to_csv)

当您想进行更复杂的操作时,较长的形式很有用:

csv = messages.map { |message| 
  if message.length < 1000
    message.to_csv
  else
    "Too long"
  end
}

关于ruby-on-rails - 如何使方法应用于 ActiveRecord 对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/224128/

相关文章:

ruby-on-rails - 为 Rails 项目创建一个 gem

ruby-on-rails - Neo4j 与 Jruby 项目 rails

ruby-on-rails - Rails 两条腿的 OAuth 提供商?

mysql - 错误 : Error installing mysql2: ERROR: Failed to build gem native extension

ruby-on-rails - 如何在rails中使用npm包?

ruby - 使用 Nokogiri 获取元素中包含特定属性名称的所有节点

ruby-on-rails - ActionCable 将打开多少个数据库连接?

Ruby:打破内联 block

Ruby 双峰与索引比较

ruby-on-rails - 如何从 Rails 应用程序的 URI 获取文件扩展名