【问题标题】:Ruby-on-Rails: Selecting distinct values from the modelRuby-on-Rails:从模型中选择不同的值
【发布时间】:2013-08-02 23:27:07
【问题描述】:

文档: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

明确说明:

query = Client.select(:name).distinct
# => Returns unique names

但是,当我在控制器中尝试时,我收到以下错误:

undefined method `distinct' for #<ActiveRecord::Relation:0xb2f6f2cc>

需要明确的是,我想要不同的名称,例如 ['George', 'Brandon'],而不是客户的实际记录。有什么我遗漏的吗?

【问题讨论】:

  • 你使用的是什么版本的 Rails?
  • ruby 1.9.2p290(2011-07-09 修订版 32553)[i686-linux]
  • 那是你的 Ruby 版本,实际上已经过时了。您应该使用 1.9.3 或更高版本。 rails -v 会告诉你你正在使用哪个版本的 Rails。
  • 另一种使用 Rails 选择 uniq 记录的方法,您可以找到 here

标签: ruby-on-rails rails-activerecord


【解决方案1】:

有一些方法:

  1. 轨道方式:

    Model.select(:name).distinct
    
  2. 半轨方式

    Model.select("DISTINCT ON(models.name) models.*")
    

    第二个允许您选择按名称唯一的第一条记录,但总的来说,不仅仅是名称。

【讨论】:

    【解决方案2】:

    为 rails 4 添加了 .distinct 选项,这是最新指南所指的内容。

    导轨 2

    如果您仍然在 rails 2 上,您将需要使用:

    Client.select('distinct(name)')
    

    导轨 3

    如果您使用的是 Rails 3,则需要使用:

    Client.select(:name).uniq
    

    如果您查看等效的section of the rails 3 guide,您可以看到两个版本之间的区别。

    【讨论】:

    • 这将从 Rails 3 上的 db 获取所有记录。
    • 指南链接明确声明它将执行SELECT DISTINCT name FROM clients。是的,它会获取所有不同的名称,但不会获取所有记录。
    【解决方案3】:

    这适用于 Rails 2(我知道很老的 Rails!)、3 和 4。

    Client.select('distinct(name)')
    

    这实际上将使用 SQL select distinct 语句

    SELECT distinct name FROM clients

    【讨论】:

    • 这在您使用两个选择语句的情况下并不总是有效:scope = Client.select("distinct name"); scope = scope.select("地址");您可能会得到无效的 sql:“选择地址,与客户端不同的名称”
    • 在列周围放置() 可以解决该问题。更新了我的答案。谢谢:)
    【解决方案4】:

    如果您不希望 ActiveRecord::Relations 返回,只是一个名称数组作为字符串,然后使用:

    Client.distinct.pluck(:name)
    

    要获得有序的结果集:

    Client.order(:name).distinct.pluck(:name)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2011-06-16
      相关资源
      最近更新 更多