selectmanager - ruby on rails git




Comment trouver des enregistrements contenant des données en double à l'aide d'Active Record (4)

Quelle est la meilleure façon de trouver des enregistrements avec des valeurs en double dans une colonne en utilisant Ruby et le nouvel Activerecord?


Avec SQL personnalisé, cette option recherche les types avec les mêmes valeurs pour le name :

sql = 'SELECT id, COUNT(id) as quantity FROM types
         GROUP BY name HAVING quantity > 1'
repeated = ActiveRecord::Base.connection.execute(sql)

Dans Rails 2.x, select est une méthode privée de classe AR. Utilisez simplement find ():

klass.find(:all, 
  :select => "id, count(the_col) as num", 
  :conditions => ["extra conditions here"], 
  :group => 'the_col', 
  :having => "num > 1")

Traduire @TuteC en ActiveRecord:

sql = 'SELECT id, 
         COUNT(id) as quantity 
         FROM types 
         GROUP BY name 
       HAVING quantity > 1'
#=>
Type.select("id, count(id) as quantity")
  .group(:name)
  .having("quantity > 1")

Voici comment je l'ai résolu avec les aides AREL, et pas de SQL personnalisé:

Person.select("COUNT(last_name) as total, last_name")
  .group(:last_name)
  .having("COUNT(last_name) > 1")
  .order(:last_name)
  .map{|p| {p.last_name => p.total} }

Vraiment, c'est juste un meilleur moyen d'écrire le SQL. Cela trouve tous les enregistrements qui ont des valeurs last_name en double, et vous indique combien et quels sont les noms de famille dans un bon hash.







arel