आप Rails 5 ActiveRecord orमें क्वेरी कैसे करते हैं ? इसके अलावा, क्या ActiveRecord प्रश्नों के साथ चेन करना संभव है ?orwhere
आप Rails 5 ActiveRecord orमें क्वेरी कैसे करते हैं ? इसके अलावा, क्या ActiveRecord प्रश्नों के साथ चेन करना संभव है ?orwhere
जवाबों:
क्वेरी में orक्लॉज के साथ चेन क्लॉज की क्षमता रेल 5 में उपलब्ध होगी । देखें संबंधित चर्चा और पुल अनुरोध ।whereActiveRecord
तो, आप निम्नलिखित चीजों को रेल 5 में कर पाएंगे :
एक प्राप्त करने के लिए postके साथ id1 या 2:
Post.where('id = 1').or(Post.where('id = 2'))
कुछ अन्य उदाहरण:
(A && B) || सी:
Post.where(a).where(b).or(Post.where(c))
(ए: बी) और& सी:
Post.where(a).or(Post.where(b)).where(c)
Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))चाहिए (a a। B) && (c) d)
ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
मुझे ए करने की जरूरत थी (A && B) || (C && D) || (E && F)
लेकिन रेल 5.1.4की वर्तमान स्थिति में यह Arel या श्रृंखला के साथ पूरा करने के लिए बहुत जटिल है। लेकिन मैं अभी भी जितना संभव हो उतना क्वेरी उत्पन्न करने के लिए रेल का उपयोग करना चाहता था।
इसलिए मैंने एक छोटा हैक किया:
अपने मॉडल में मैंने एक निजी विधि बनाई, जिसे कहा जाता है sql_where:
private
def self.sql_where(*args)
sql = self.unscoped.where(*args).to_sql
match = sql.match(/WHERE\s(.*)$/)
"(#{match[1]})"
end
अपने दायरे के आगे मैंने OR की पकड़ बनाने के लिए एक सरणी बनाई
scope :whatever, -> {
ors = []
ors << sql_where(A, B)
ors << sql_where(C, D)
ors << sql_where(E, F)
# Now just combine the stumps:
where(ors.join(' OR '))
}
जो अपेक्षित क्वेरी परिणाम का उत्पादन करेगा
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F)):।
और अब मैं आसानी से किसी भी गलत OR के बिना अन्य scopes आदि के साथ इसे जोड़ सकता हूं।
सुंदरता यह है कि मेरा sql_where जहां-जहां सामान्य तर्क-वितर्क करता है:
sql_where(name: 'John', role: 'admin')उत्पन्न करेगा (name = 'John' AND role = 'admin')।
.merge&& के बराबर का उपयोग कर सकते हैं , और अपने परनों को पकड़ने के लिए एक उचित पेड़ का निर्माण कर सकते हैं । कुछ ऐसा ... (scopeA.merge(scopeB)).or(scopeC.merge(scopeD)).or(scopeE.merge(scopeF)), मान लें कि प्रत्येक स्कोप कुछ ऐसा दिखता हैModel.where(...)
रेल 5 में orक्लॉज की क्षमता है where। उदाहरण के लिए।
User.where(name: "abc").or(User.where(name: "abcd"))