Ruby on rails 按多个唯一字段查找Rails

Ruby on rails 按多个唯一字段查找Rails,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我正试图找到一种方法,通过多个唯一字段来查询条目。例如,我想找到一个项目,其中国家和城市都是独一无二的 对于我一直使用的单个字段: @foo = Foo.where(created_at: from..to).to_a.uniq{ |foo| foo.bar } 其中,bar是my Foo表中唯一的字段 如果bar和baz字段是唯一的,我如何获取Foo?您可以使用带有arary作为返回的唯一方法: @foo = Foo.where(created_at: from..to).to_a.uniq

我正试图找到一种方法,通过多个唯一字段来查询条目。例如,我想找到一个项目,其中国家和城市都是独一无二的

对于我一直使用的单个字段:

@foo = Foo.where(created_at: from..to).to_a.uniq{ |foo| foo.bar }
其中,bar是my Foo表中唯一的字段

如果bar和baz字段是唯一的,我如何获取Foo?

您可以使用带有arary作为返回的唯一方法:

@foo = Foo.where(created_at: from..to).to_a.uniq{ |foo| [foo.bar, foo.baz] }
使用

下面是一个示例,演示此查询如何在多个列上提供唯一记录。让我们创建一个表:

app_development=# select * from clients;
 id | age | name |         created_at         |         updated_at
----+-----+------+----------------------------+----------------------------
  1 |  26 | Arup | 2015-03-23 08:56:45.968966 | 2015-03-23 08:56:45.968966
  2 |  26 | Arup | 2015-03-23 08:56:57.269637 | 2015-03-23 08:56:57.269637
  3 |  25 | Ayan | 2015-03-23 08:57:06.956179 | 2015-03-23 08:57:06.956179
(3 rows)

appdevelopment=# SELECT DISTINCT ON (name) name, age FROM "clients"   ORDER BY name, age;
 name | age
------+-----
 Arup |  26
 Ayan |  25
(2 rows)
您也可以在Rails中执行相同的操作:

2.1.2 :005 > Client.select("DISTINCT ON (name) name, age").order("name, age")
  Client Load (0.9ms)  SELECT DISTINCT ON (name) name, age FROM "clients"   ORDER BY name, age
 => #<ActiveRecord::Relation [#<Client id: nil, age: 26, name: "Arup">, #<Client id: nil, age: 25, name: "Ayan">]>
2.1.2 :006 > Client.select("DISTINCT ON (name) name, age").order("name, age").map { |r| [r.name, r.age] }
  Client Load (0.5ms)  SELECT DISTINCT ON (name) name, age FROM "clients"   ORDER BY name, age
 => [["Arup", 26], ["Ayan", 25]]

为什么不尝试链接多个uniq方法调用呢。。我被否决了,因为我不理解你的示例代码..:你能说得更具体些吗。。这样我也可以帮你,…:是否要查找数据库中唯一的记录或删除重复记录?数据库客户端名称是什么?这真的很值得一提。@当然,在博士后中,你也可以使用一个适当的选择不同的条款。不同的on和uniq之间有什么区别?@knowbody uniq是的别名。但是,正如您过去所使用的那样,您使用的是Arrayuniq,而不是SQL distinct。但Distinct_on是Postgres的功能。@knowbody立即检查,并使用SQL尽可能多地执行此操作..:D
2.1.2 :005 > Client.select("DISTINCT ON (name) name, age").order("name, age")
  Client Load (0.9ms)  SELECT DISTINCT ON (name) name, age FROM "clients"   ORDER BY name, age
 => #<ActiveRecord::Relation [#<Client id: nil, age: 26, name: "Arup">, #<Client id: nil, age: 25, name: "Ayan">]>
2.1.2 :006 > Client.select("DISTINCT ON (name) name, age").order("name, age").map { |r| [r.name, r.age] }
  Client Load (0.5ms)  SELECT DISTINCT ON (name) name, age FROM "clients"   ORDER BY name, age
 => [["Arup", 26], ["Ayan", 25]]