2015-03-23 5 views
1

Я пытаюсь найти способ, как я сделаю запрос для поиска элементов несколькими уникальными полями. Так, например, я хотел бы найти пункт, где «Страна» и «Город» уникальны.Поиск по нескольким уникальным полям Rails

для одного поля я использую:

@foo = Foo.where(created_at: from..to).to_a.uniq{ |foo| foo.bar } 

где bar это уникальное поле в моей Foo таблице.

Как я могу получить Foo где bar и baz поля уникальны?

+0

Почему вы не попробовать несколько цепочек 'uniq' вызовов методов? – hattenn

+0

Ну .. я получил downvote, так как я не понимаю ваш пример кода .. :) Не могли бы вы рассказать об этом более конкретно .. так что я тоже могу вам помочь ..: D –

+0

Вы хотите найти записи, которые уникальны в вашей базы данных или вы хотите удалить дубликаты? – Fer

ответ

1

Вы можете использовать unique метод с arary как возвращение:

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

, конечно же, на postgres вы также можете использовать подходящую отдельную статью – lx00st

1

Пользуется DISTINCT ON

Foo.where(created_at: from..to) 
    .select("DISTINCT ON (foo) foo, bar") 
    .order("foo, bar") 

Вот пример, чтобы показать, как этот запрос дает уникальные записи по нескольким столбцам. Позволяет создать таблицу:

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]] 
+0

. В чем разница между 'DISTINCT ON' и' uniq'? – knowbody

+0

@knowbody '# uniq' является псевдонимом [' distinct'] (http://apidock.com/rails/ActiveRecord/QueryMethods/uniq). Но поскольку вы использовали 'to_a', вы использовали' Array # uniq', а не SQL _distinct_. Но 'disntict_on' - функция Postgres. –

+0

@knowbody проверить сейчас и сделать так, как вы можете использовать 'SQL' ..: D –

Смежные вопросы