我有一个项目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
答案 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