ActiveRecord Rails:获取字段唯一/不同的记录

时间:2017-03-15 06:41:32

标签: ruby-on-rails ruby activerecord unique

我有一个项目Ruby 2.4.0和Rails 5.0.1以及一个包含以下内容的模型:

class Hospital < ApplicationRecord

  validates_presence_of :name
  validates_presence_of :state
  validates_presence_of :unit
  validates_presence_of :site

  def self.get_hospitals
    hospitals = order(:name).all 
    grouped = hospitals.group_by(&:state)
  end  
end

然后我使用“分组”哈希来填充我显示h.name + ' (' + h.unit.to_s + ')'的下拉框。

我的问题是该列表中可能存在重复项,如果有,那么我只想要其中一个。

如何查询记录并返回整个记录(不是采摘或选择只返回一个字段的位置),名称是唯一的?

类似的东西:

hospitals = order(:name).distinct

5 个答案:

答案 0 :(得分:2)

我不知道如何使用SQL来实现它,但method uniq of Array可能会这样做:

def self.get_hospitals
  hospitals = order(:name).all
  unique = hospitals.uniq(&:name)
  grouped = unique.group_by(&:state)
end

答案 1 :(得分:0)

我想这会对你有帮助

{{1}}

答案 2 :(得分:0)

这是通过唯一属性获取所有对象的一种方法:

Hospital.select('distinct on (name) *')

答案 3 :(得分:0)

您可以尝试distinct

distinct.order(name: :desc)

如果您想要分组,那么您也可以尝试group

 distinct.group(:id, :state).order(name: :desc)

将代替hospitals.group_by(&:state)

查询将返回如下所示的内容

SELECT DISTINCT "hospitals".* FROM "hospitals" GROUP BY "hospitals"."id", "hospitals"."state"  ORDER BY "hospitals"."name" DESC

答案 4 :(得分:0)

我无法让它在SQL级别工作,所以我实现了一个&#39; .uniq&#39;我传递到下拉列表的数组上的解决方案。

def self.get_hospitals
    hospitals = order(:name).all
    grouped = hospitals.group_by(&:state)

    output = grouped.collect { |state, hospitals| [state, hospitals.collect { |h| [h.name, h.id] }] }

    output.each do |key, value|
      value.uniq!
    end
    output.sort { |a, b| a[0] <=> b[0] }
  end