在我的RoR项目中,有一个包含10个属性的Customer模型。现在我想找到那些至少有三个共同属性的客户。如何有效地进行此查询?
可能它是一个解决方案:
Customer.select([:first_name,:last_name,:language]).
group(:first_name,:last_name,:language).having("count(*) > 1")
但是这个解决方案需要太多的组合来检查。请帮助提供更好的解决方案。
谢谢!提前。
答案 0 :(得分:0)
这是迄今为止我能想到的最好的。也不是SQL解决方案。
# Arrange a 3-items combination of columns, removed id and timestamps
triplets = Customer.column_names.reject {|column| column == "id" || column == "created_at" || column == "updated_at"}.combination(3).to_a
#Group All records by same item values for each 3-items combination
all = Customer.all
res = triplets.map do|t|
all.to_a.group_by {|c| [ {t[0] => c.send(t[0].to_sym)}, { t[1] => c.send(t[1].to_sym) }, {t[2] => c.send(t[2].to_sym)} ]}
end
# removed combinations with only 1 record
final_result = res.map {|h1| h1.reject { |k, v| v.count <= 1}}
# There you have customer with 3 attributes common combinations