2016-02-25 11 views
9

मैं मैनुअल join कर रहा हूँ और मैं अपने ON खंड के लिए एक पैरामीटर पारित करने के लिए की जरूरत है:parametrized रेल में शामिल होने के 4

Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.baz = #{baz}") 

वहाँ baz एक पैरामीटर के रूप पारित करने के लिए, संभावित इंजेक्शन समस्याओं से बचने के लिए एक रास्ता है? एक विधि sanitize_sql_array है, लेकिन मुझे यकीन नहीं है कि इस मामले में इसका उपयोग कैसे करें।

नोट: मैं where का उपयोग नहीं कर सकता क्योंकि यह वही नहीं है।

+0

तो baz एक और शामिल हो गए मॉडल है? क्या आप मुझे बज़ के लिए मूल्य दे सकते हैं? –

+0

हाँ, यह जानना अच्छा होगा कि बाज़ क्या हो सकता है। – Kulgar

+0

'baz' उदाहरण के लिए एक स्ट्रिंग अक्षर या संख्या वाला एक चर है। यह एक और मॉडल नहीं है, यह एक मूल्य है जिसे मैं बाहरी जुड़ाव में ऑन शर्त पर भेजना चाहता हूं। –

उत्तर

8

sanitize_sql_array के साथ, कि होगा:

# Warning: sanitize_sql_array is a protected method, be aware of that to properly use it in your code 
ar = ["LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.baz = %s", baz] 
# Within foo model: 
sanitized_sql = sanitize_sql_array(ar) 
Foo.joins(sanitized_sql) 

यह कोशिश की और यह काम किया।

+0

@mladenjablanovic देखें - क्या यह आपके लिए काम करता है? – Kulgar

-2

मुझे लगता है कि आप इस तरह से प्रयास करना चाहिए:

Foo.joins("LEFT OUTER JOIN bars ON foo.id = bars.foo_id AND bars.baz = ?", baz) 

अधिक पैरामीटर के साथ:

Foo.joins("LEFT OUTER JOIN bars ON foo.id = ? AND bars.baz = ? AND ...", foo, baz, etc...) 
+1

यह सही दृष्टिकोण है। –

+5

दुर्भाग्य से, यह काम नहीं करता है। 'baz' को पैरामीटर मान के रूप में व्याख्या नहीं किया गया है, लेकिन एक और मॉडल में शामिल होने के रूप में। आप इसे स्वयं आज़मा सकते हैं। https://github.com/rails/rails/blob/9b67cb3d394692aa7feb7510aab0871e557d3dd0/activerecord/lib/active_record/relation/query_methods.rb#L1036 –

+0

AFAIK रेल (4.0 पर भी) 'जॉइन' क्लॉज में पैरामीटर का समर्थन नहीं करता है। म्लेडन ने निष्कर्ष निकाला है कि किसी को स्वयं को SQL कथन उत्पन्न करना होगा। मुझे लगता है [@ कुल्गार के पास यह सही है] (http://stackoverflow.com/a/35744285/712765) इसे सुरक्षित तरीके से कैसे करें। –

-2

यदि आप मूल्यों की एक हैश पारित, एआर एसक्यूएल इंजेक्शन के खिलाफ आप की रक्षा करेगा सुरक्षित होना चाहिए, इस तरह:

Foo.joins("LEFT OUTER JOIN bars ON foo.id = bars.foo_id").where(bars: {baz: baz}) 

बस डॉन एसक्यूएल में पंक्ति तार कि एसक्यूएल इंजेक्शन की चपेट में हैं का उपयोग नहीं।

+0

दुर्भाग्य से, मैं जो चाहता हूं वह नहीं। WHERE की स्थिति ON में स्थिति के बराबर नहीं है। –

+2

बाहरी शामिल होने के कारण, 'जॉइन' खंड में स्थिति होने पर 'WHERE' खंड की स्थिति होने से अलग है। Http://sqlfiddle.com/#!9/c827b7/5 –

7

सक्रिय रिकॉर्ड मॉडल sanitize वर्ग विधि है, तो आप कर सकता है:

Foo.joins("LEFT OUTER JOIN bars ON foos.id = bars.foo_id AND bars.baz = #{Foo.sanitize(baz)}") 
संबंधित मुद्दे