【问题标题】:What's the difference between Rails active record's select and group?Rails 活动记录的选择和组有什么区别?
【发布时间】:2014-11-04 02:17:18
【问题描述】:

我一直在阅读有关 Rails 的活动记录模型操作的教程。我对.select 和.group 之间的区别有点困惑。如果我想在表 User 中获取所有用户的所有名称,我相信我可以这样做:

myUsers = User.select(:name)

那么这与说:

myUsers = User.group(:name)

谢谢,

【问题讨论】:

    标签: mysql ruby-on-rails rails-activerecord


    【解决方案1】:

    两者的区别如下:

    User.select(:name)
    

    相当于这条SQL语句

    SELECT name from users;
    

    User.group(:name)
    

    等价于

    SELECT * from users GROUP BY name;
    

    不同之处在于,使用select(:name),您将获取按id 排序的所有行,但仅使用列name。使用group(:name),您将获取所有行所有列,但按name 列排序。

    User.pluck(:name) 将是从您的数据库中提取所有名称的最快方法。

    【讨论】:

    • 啊,好的。感谢您的澄清!
    【解决方案2】:

    #to_sql 方法可以检查它正在构建什么DB 查询。通过查看数据库查询,您可以确认自己发生了什么。看下面的例子:-

    arup@linux-wzza:~/Rails/tv_sms_voting> rails c
    Loading development environment (Rails 4.1.4)
    >> Vote.group(:choice).to_sql
    => "SELECT \"votes\".* FROM \"votes\"  GROUP BY choice"
    >> Vote.select(:choice).to_sql
    => "SELECT \"votes\".\"choice\" FROM \"votes\""
    >>
    

    现在很明显Vote.select(:choice)实际上是SELECT "votes"."choice" FROM "votes",也就是说,从表votes的所有行中选择choice列。

    Vote.group(:choice) 正在根据choice 列对votes 表的行进行分组,并选择所有列。

    如果我想获取表 User 中所有用户的所有名称。

    User.pluck(:name) 更好。

    【讨论】:

    • 好的。那么这与 Vote.all.order(:choice) 之类的东西有什么不同吗?
    • 这样做将为您提供按choice 列排序的所有记录(所有列),而不是仅按表ID 排序的name 列。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多