आप Rails 5 ActiveRecord or
में क्वेरी कैसे करते हैं ? इसके अलावा, क्या ActiveRecord प्रश्नों के साथ चेन करना संभव है ?or
where
आप Rails 5 ActiveRecord or
में क्वेरी कैसे करते हैं ? इसके अलावा, क्या ActiveRecord प्रश्नों के साथ चेन करना संभव है ?or
where
जवाबों:
क्वेरी में or
क्लॉज के साथ चेन क्लॉज की क्षमता रेल 5 में उपलब्ध होगी । देखें संबंधित चर्चा और पुल अनुरोध ।where
ActiveRecord
तो, आप निम्नलिखित चीजों को रेल 5 में कर पाएंगे :
एक प्राप्त करने के लिए post
के साथ id
1 या 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"))