2015-12-13 10 views
5

क्या fragments का पुन: उपयोग करना किसी भी तरह से संभव है?टुकड़े पुन: उपयोग

इस

def unpublished_by_title(title) do 
    from p in Post, 
    where: is_nil(p.published_at) and 
      fragment("downcase(?)", p.title) == ^title 
end 

ऐसा लगता है जैसे कि यह एक अलग समारोह में टुकड़ा-भाग को निकालने के लिए सक्षम होने के लिए बहुत सुविधाजनक हो जाएगा इतना है कि यह, जैसे अन्य स्थानों में पुन: उपयोग किया जा सकता है की तरह एक उदाहरण में:

def unpublished_by_title(title) do 
    from p in Post, 
    where: is_nil(p.published_at) and 
      downcase(p.title) == ^title 
end 

def downcase(title) do 
    fragment("downcase(?)", ^title) 
end 

हालांकि, कई अलग-अलग बदलावों की कोशिश करने के बाद ऐसा लगता है कि यह मैक्रो विस्तार या ऐसा कुछ करने के कारण काम नहीं करेगा। कोई विचार?

उत्तर

5

आप सही हैं, संकलन समय पर प्रश्न बनाये गये हैं। इस वजह से, यदि आप क्वेरी सिंटैक्स को विस्तारित करना चाहते हैं, तो आपको नियमित कार्यों के बजाय मैक्रोज़ को परिभाषित करने की आवश्यकता है।

defmacro downcase(field) do 
    quote do 
    fragment("downcase(?)", unquote(field)) 
    end 
end 

याद रखें कि आप इससे पहले कि आप इसका इस्तेमाल मैक्रो परिभाषित करने की जरूरत:

कुछ निम्नलिखित की तरह चाल करना चाहिए।

+0

हाय, सुझाव के लिए धन्यवाद। अफसोस की बात है कि मैंने यह कोशिश की और यह काम नहीं किया, मैंने प्रश्न के अद्यतन भाग में एक संभावित कारण के बारे में लिखा। – ave

+2

@ave मेरे लिए पूरी तरह से काम करता है। क्या आप सुनिश्चित करते हैं कि मैक्रो को _above_ परिभाषित किया गया है जो फ़ंक्शन का उपयोग करता है? –

संबंधित मुद्दे