2016-03-31 14 views
2

kaydeden oluşturun: Eğer kapsamda istediğiniz ne yapmanız gerektiği ileRaylar sınıfta adıyla tüm çiftleri çekmek gerekir Eğer bunu ulaşabildikleri takdirde yinelenenler kapsamı

Company.select(:name).group(:name).having("count(*) > 1") 

scope :duplicates, -> { where (...?)} 

Ayrıca karşılığında sadece alan adı değil, sadece birkaç alana ihtiyacım var. Herkesin bir kapsam oluşturmak için aynı sorunu vardı?

class Shirt < ActiveRecord::Base 
    def self.red 
    where(color: 'red') 
    end 
end 

böyle kapsamını tanımlayabiliriz:

scope :duplicates, -> { ids = select(:id).group(:name).having("count(name) > 1"); where(id: ids) }

cevap

0

scope :red, -> { where(color: 'red') }

yana gerçek bir sınıf yöntemi tanımlamak için 'sözdizimsel şeker' basitçe Bunu çalıştırman gerek iki sorguda. İlk sorgu yinelenen adları ikincisi o yinelenen isimlerle ile kayıtlar seçen seçer ve daha kapsamları gerekirse ile zincirleme şekilde current_scope kullanır (maalesef current_scope çok kullanışlı ama undocumented yöntem olarak görünmektedir):

scope :duplicates, 
     -> { 
     dup_names = Company.group(:name).having("count(*) > 1").pluck(:name)    
     current_scope.where(name: dup_names) 
     } 

(dup_names değişken şirketleri arasında bulunan yinelenen adlarının dizisini içerecektir.)

Sonra kolayca örneğin, yinelenen kayıtları ile ilgili daha koşullar ekleyebilirsiniz:

Company.duplicates.where("name like 'a%'").limit(2) 

, 'a' ile başlayan iki adιmι seçecektir (ve çift adι ile).

+0

çalışmıyor – Misha

+0

Sonuçlar istediğiniz veya sözdizimi hatası veya ... değil mi? bazı günlük veya detaylar verebilir misiniz. – abookyun

0

+0

Cevabınız için teşekkürler. Bu, dizide bir alan verisi arıyorsanız, bu işi yapabilir. Ama eğer daha fazla ada isminde alana ihtiyacım varsa, muhtemelen daha önceki gruplama nedeniyle gerçekleşmiyor. Yani böyle bir şey işe yaramaz - Company.group (: name) .having ("count (*)> 1") pluck (: isim,: id) – Misha

+0

Bence 'grubun' nasıl çalıştığını yanlış anlayabilirsiniz. ya da neyi başarmaya çalıştığınızı anlamıyorum. Yalnızca 'Şirket_dosyaları' çalıştırırsanız, tüm kayıtları 'id' dahil olmak üzere tüm öznitelikleriyle dup adlarıyla döndürür. Kapsamdaki ikinci sorgu budur. Gruplama işlevi her grup için tek bir (rastgele) kayıt seçeceğinden, 'name' ile gruplandırıldığında 'id' öğesini seçmeye (veya' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – BoraMa