2016-04-13 10 views
1

birden çok sütun birleştirir.Raylar Ben üç sütun, <code>first_name</code>, <code>middle_name</code> ve <code>last_name</code> ile müşterilerin modele sahip Benim uygulamada arama

class Customer < ActiveRecord::Base 
    belongs_to :user 

    def self.search(search, user) 
    if search 
     .where('first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?', "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%") 
     .where(user: user) 
    else 
     where(user: user) 
    end 
    end 

end 

Bu arama fonksiyonu ile sorun, sadece bir seferde üç sütunlardan biri tarafından arama izin vermesidir: Ben araması yapar modelinde bir yöntem var. Örneğin, bir müşterinin "foo" adlı bir first_name, "bar" ın bir middle_name ve "baz" bir son_adı vardır. "Foo", "bar" veya "baz" kelimelerinin aranması sonuçları tek tek döndürür, ancak "foo çubuğu" veya "bar baz" değeri yoktur. Üç sütunun tamamında arama yapmanın en iyi yolu nedir?

cevap

2

Sen Güncelleme

gibi veritabanı sorgusunda field s Concat edebilirsiniz:

.where("concat_ws(' ' , first_name, middle_name, last_name) LIKE ?", "%#{search}%") 

Bu, foo için foo bar veya foo bar baz ancak foo baz

Eğer çalışmalıdır

ardından hem foo baz desteklemek istiyoruz
.where("first_name LIKE ? OR middle_name LIKE ?"\ 
     " OR last_name LIKE ? OR concat_ws(' ' , first_name, middle_name, last_name) LIKE ?"\ 
     " OR concat_ws(' ' , first_name, last_name) LIKE ?", 
     "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%") 
+0

gibi deneyebilirsiniz bu? ben sqlite kullanıyorum belirli bir veritabanına gerektiriyor mu kalkınma için – James

+0

özür dilerim: Ben tek fiyat teklifi çift tırnak işareti – illusionist

1

.Where ("GİBİ FIRST_NAME'in? OR ORTA ORTAK GİBİ? OR son_name LIKE? ya CONCAT (first_name, middle_name, last_name) GİBİ? " "% # {arama}%", "% # {arama}%", "% # {arama}%", "% # {arama}%"," Eğer sf kullanırsanız% # {arama}% ")

+0

değiştirmeyi unuttum Bu kod soruya cevap verebilir rağmen, sağlayarak _why_ ve/veya _how_ yanıtları ile ilgili önemli bir soru uzun vadeli değerini önemli ölçüde artıracaktır. answe [değiştir] r biraz açıklama eklemek için. –

0

, sen. Ben sorun çalışan bu kodu alma yaşıyorum bu

def self.search(query) 
    where(['phone ilike :query', 
     'LOWER(name) ilike :query', 
     'LOWER(email) ilike :query', 
     'LOWER(address) ilike :query'].join(' OR '), {query: "%#{query}%" }) 
end 
İlgili konular