2013-10-16 7 views
12

मैं कैसे कुछ इस तरह कर सकते हैं?रेल जहां की तरह और सरणी

myarray = ["name1","name2"] 
Product.where('name ILIKE ?', %#{myarray}%) 

मैं सभी उत्पादों जहां नाम name1 और name2 की तरह हैं पाने के लिए की जरूरत है।

क्या यह संभव है?

Product.where(name: myarray) 

Product.where(name: myarray).to_sql 
    # => SELECT "products".* FROM "products" WHERE "products"."name" IN ('x', 'y') 

, लेकिन यदि आप सबस्ट्रिंग फ़िल्टर करना चाहते हैं (जैसे LIKE '%substring%':

उत्तर

-1

आप समानता के अर्थ में स्ट्रिंग-समानता के लिए देख रहे हैं (जैसे एसक्यूएल में LIKE 'string') where सरणी मूल्यों की एक हैश को स्वीकार करता है एसक्यूएल में) एडगर जेकाबन्सन का जवाब देखें।

+0

सवाल की तरह के बारे में पूछा। –

+0

प्रश्न ने कुछ * जैसे * दिए गए दृष्टिकोण के लिए पूछा जो 'name1' और 'name2' की खोज करने की अनुमति देता है। यह वही है जो मेरा जवाब करता है। क्या आप वास्तव में मेरे जवाब को कम करते हैं क्योंकि यह एक अलग दृष्टिकोण प्रदान करता है? –

+0

वह परिणाम किसी भी शब्द 'name1' या' name2' युक्त जबकि आपका जवाब सही 'name1' के लिए मिलान दिया और' name2' नाम शामिल करना चाहता है। वह 'ILIKE' कीवर्ड से पूछताछ के लिए पूछ रहा था। –

24

मुझे लगता है कि आप ILIKE समारोह के साथ सभी मूल्यों का परीक्षण करना चाहते।

यह है कि यह कैसे Postgres में किया है है:

select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']); 

इस तरह रेल/रूबी वाक्य रचना करने के लिए बदलने की कोशिश:

myarray_with_percetage_signs = ["name1","name2"].map {|val| "%#{val}%" } 
Product.where("name ILIKE ANY (array[?])", myarray_with_percetage_signs) 
संबंधित मुद्दे