假设我有一个带有Account
列的模型:email, :name, etc
。电子邮件并不是唯一的。我想要的是添加一个可链接 scope
,用于选择包含不同电子邮件但包含所有其他字段的行。 “可链接”我的意思是我可以这样做:Account.uniq_by_email.where(bla bla)
。
我尝试了什么:
使用select
:
def self.uniq_by_email
select('distinct email')
end
对我来说不起作用,因为它只选择电子邮件字段。
使用group
def self.uniq_by_email
group(:email)
end
这几乎是我想要的:我可以链接并选择所有字段。但是count
方法有一个奇怪的地方:正如你已经猜到的那样,它会返回一个电子邮件计数的哈希值。但我希望它返回“简单”ActiveRecord_Relation
,其中count
只返回一个不是哈希的计数。这有可能实现吗?
答案 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