Rails 4 Active Record uniq由一列查询

时间:2015-11-16 15:48:38

标签: mysql ruby-on-rails activerecord

假设我有一个带有Account列的模型:email, :name, etc。电子邮件并不是唯一的。我想要的是添加一个可链接 scope,用于选择包含不同电子邮件但包含所有其他字段的行。 “可链接”我的意思是我可以这样做:Account.uniq_by_email.where(bla bla)

我尝试了什么:

  1. 使用select

    def self.uniq_by_email
      select('distinct email')
    end
    

    对我来说不起作用,因为它只选择电子邮件字段。

  2. 使用group

    def self.uniq_by_email
      group(:email)
    end
    

    这几乎是我想要的:我可以链接并选择所有字段。但是count方法有一个奇怪的地方:正如你已经猜到的那样,它会返回一个电子邮件计数的哈希值。但我希望它返回“简单”ActiveRecord_Relation,其中count只返回一个不是哈希的计数。这有可能实现吗?

2 个答案:

答案 0 :(得分:3)

我的基本想法是只选择每组电子邮件中的第一个条目。 让它变得简单,我创建一个像这样的范围而不是使用类方法:

scope :uniq_by_email, -> { joins("JOIN (
                                   SELECT MIN(id) as min_id
                                   FROM accounts
                                   GROUP BY email
                                  ) AS temp
                                  ON temp.min_id = id") }

从这里你可以像你描述的那样做一些像可链接的东西:

Account.uniq_by_email.where(bla bla)

答案 1 :(得分:1)

好吧,你可以使用group by,但是你可以算作,

 Account.uniq_by_email.where(bla bla).flatten.count