Ruby-on-Rails:从模型中选择不同的值

Bry*_*ord 18 ruby-on-rails rails-activerecord

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

清楚地说明:

query = Client.select(:name).distinct
# => Returns unique names
Run Code Online (Sandbox Code Playgroud)

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

undefined method `distinct' for #<ActiveRecord::Relation:0xb2f6f2cc>
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我想要不同的名称,如['George','Brandon'],而不是客户的实际记录.有什么东西我错过了吗?

Sha*_*ell 37

.distinct为这就是最新的指南是指轨道4,5加入选项.如果您仍在轨道3上,则需要使用:

Client.select('distinct(name)')
Run Code Online (Sandbox Code Playgroud)

如果您查看rails 3指南的等效部分,您可以看到两个版本之间的差异.

  • 至少在Rails 7上,`select + uniq`返回所有记录以在应用程序上进行过滤,而`select + unique`在查询中使用DISTINCT,仅将uniq列表返回到应用程序 (2认同)

Мал*_*евъ 8

有一些方法:

  1. 导轨方式:

    Model.select(:name).distinct
    
    Run Code Online (Sandbox Code Playgroud)
  2. 半轨方式

    Model.select("DISTINCT ON(models.name) models.*")
    
    Run Code Online (Sandbox Code Playgroud)

    第二个允许您选择按名称唯一的第一条记录,但在整个事件中,不仅是名称。


Dav*_*dge 6

如果您不想返回 ActiveRecord::Relations,只需将名称数组作为字符串,然后使用:

Client.distinct.pluck(:name)
Run Code Online (Sandbox Code Playgroud)

获取有序结果集:

Client.order(:name).distinct.pluck(:name)
Run Code Online (Sandbox Code Playgroud)


San*_*osh 5

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

Client.select('distinct(name)')
Run Code Online (Sandbox Code Playgroud)

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

SELECT distinct name FROM clients