按Rails 3中的唯一列值选择所有列

时间:2012-04-25 21:36:21

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

在Rails 3中,如何根据唯一列值选择行,我需要获取所有列,例如:

SELECT COUNT(DISTINCT date) FROM records

这只返回日期列,但我希望所有列(名称,日期,年龄,created_at)列不仅仅是日期。

感谢您的帮助

4 个答案:

答案 0 :(得分:7)

这里的问题是,根据定义,可能存在多个具有相同日期的记录。它需要用户空间中的逻辑来确定具有唯一日期的多个记录中的哪一个使用。以下是获取这些行的一些代码:

Record.select("distinct date").each do |record|
    records = Record.find_by_date record.date
    puts records.count # do something with the records
end

如果您真正关注的是多列之间的唯一性,请列出不同查询中的所有相关列:

Record.select("distinct date, name, age, created_at").each do |record|
    puts record.date
    puts record.name
    puts record.age
    puts record.created_at
    # ``record'' still represents multiple possible records
end

您使用distinct的事实意味着返回的每个“行”实际上代表 n 行,因此DB不知道要拉哪个 n 行来自的其余列。这就是为什么它只返回distinct中使用的列。它没有别的......

答案 1 :(得分:5)

我认为这会对你有帮助

Model.find(:all, :select => 'DISTINCT name, date, age, created_at')

请使用它并告诉我。

答案 2 :(得分:4)

Model.group(:column)

对于你的情况:

Record.group(:date)

这将返回所有列,没有“日期”重复。

答案 3 :(得分:1)

对于rails 3.2及更高版本,Model.select('DISTINCT name, date, age, created_at')