Rails - 给定一组用户 - 如何获得电子邮件的输出?

The*_*xit 3 ruby-on-rails ruby-on-rails-3

我有以下内容:

@users = User.all
Run Code Online (Sandbox Code Playgroud)

用户有几个字段,包括电子邮件

我希望能够获得所有@users电子邮件的列表.

我试过了:

@users.email.all but that errors w undefined
Run Code Online (Sandbox Code Playgroud)

想法?谢谢

Rya*_*igg 12

(按流行需求,发布作为真实答案)

我不喜欢fl00r的解决方案是它在数据库中为每条记录实例化一个新的User对象; 这只是不规模.这对于一个只有10封电子邮件的表来说非常棒,但是一旦你开始涉及成千上万,你就会遇到问题,主要是Ruby的内存消耗.

通过在模型上使用connection.select_values以及一点ARel优点,可以解决这个小问题:

User.connection.select_values(User.select("email").to_sql)
Run Code Online (Sandbox Code Playgroud)

这将为您提供数据库中电子邮件地址的直接字符串.没有对用户对象感到不满,并且比直接User.select("email")查询更好地扩展,但我不会说它是"最佳规模".可能有更好的方法来做到这一点,我还没有意识到.

问题的关键是:一个String对象将使用的方式较少的内存比User对象,这样你可以有更多的人.它也是一个更快的查询,并没有很长的路要走(运行查询,然后映射值).哦,map也需要更长的时间.

如果您使用的是Rails 2.3 ...

然后你必须手动构建SQL,我很遗憾地说.

User.connection.select_values("SELECT email FROM users")
Run Code Online (Sandbox Code Playgroud)

只是提供了Rails 3提供的帮助程序的另一个示例.


fl0*_*00r 6

User.select(:email).map(&:email)
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这个解决方案的是它在数据库中为每个记录实例化一个新的`User`对象; 这只是不规模.通过在模型上使用`connection.select_values`和一点ARel优点,可以解决这个小问题:`User.connection.select_values(User.select("email").to_sql)`.这将为您提供数据库中电子邮件地址的直接字符串.对用户对象毫不犹豫. (8认同)

小智 6

我仍然发现connection.select_values是一个有效的方法,但我最近发现了一个内置在Rails中的默认AR方法,它将为你做到这一点:pluck.

在您的示例中,您需要执行的所有操作都是:

User.pluck(:email)
Run Code Online (Sandbox Code Playgroud)

select_values方法在极大的数据集上可以更快,但这是因为它没有对返回的值进行类型转换.例如,布尔值将返回它们如何存储在数据库中(如1和0)并且不是真的| 假.

pluck方法适用于ARel,因此您可以菊花链式连接:

User.order('created_at desc').limit(5).pluck(:email)
Run Code Online (Sandbox Code Playgroud)