Mysql Rails 4活动记录uniq按一列查询

Mysql Rails 4活动记录uniq按一列查询,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,假设我有一个模型帐户,有:email、:name等列。电子邮件不是唯一的。我想要的是添加一个可链接的范围,它选择具有不同电子邮件但具有所有其他字段的行。“可链接”是指我可以这样做:Account.uniq\u By\u email.where(bla-bla) 我所尝试的: 使用选择: def self.uniq_by_email select('distinct email') end 不适用于我,因为它只选择电子邮件字段 与组一起 def self.uniq_by_email gr

假设我有一个模型
帐户
,有
:email、:name等列
。电子邮件不是唯一的。我想要的是添加一个可链接的
范围
,它选择具有不同电子邮件但具有所有其他字段的行。“可链接”是指我可以这样做:
Account.uniq\u By\u email.where(bla-bla)

我所尝试的:

  • 使用
    选择

    def self.uniq_by_email
      select('distinct email')
    end
    
    不适用于我,因为它只选择电子邮件字段

  • 组一起

    def self.uniq_by_email
      group(:email)
    end
    
    这几乎就是我想要的:我可以链接,它选择所有字段。但是
    count
    方法有一个奇怪的地方:正如您已经猜到的,它返回电子邮件计数的散列。但是我想让它返回“simple”
    ActiveRecord\u Relation
    ,其中
    count
    只返回一个计数,而不是散列。这有可能实现吗


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

    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)
    

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

    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)
    

    好吧,你可以用分组方式,但你可以算作

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

    好吧,你可以用分组方式,但你可以算作

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

    是的,当然,但这不是我的解决办法。此
    uniq\u by_email
    用于根据条件进行多步骤过滤。因此,在查询结束时,我不想发现是否调用了
    uniq\u by\u email
    。我只是想确定找到的记录的数量,但这不是我的解决方案。此
    uniq\u by_email
    用于根据条件进行多步骤过滤。因此,在查询结束时,我不想发现是否调用了
    uniq\u by\u email
    。我只想得到找到的recordstx的数量,这就是我在找的fortx,这就是我在找的