আপনি কীভাবে রেলস 5 অ্যাক্টিভেকর্ডে একটি orকোয়েরি করবেন? এছাড়া, এটিও শৃঙ্খল করা সম্ভব সঙ্গে ActiveRecord ক্যোয়ারীগুলি?orwhere
আপনি কীভাবে রেলস 5 অ্যাক্টিভেকর্ডে একটি orকোয়েরি করবেন? এছাড়া, এটিও শৃঙ্খল করা সম্ভব সঙ্গে ActiveRecord ক্যোয়ারীগুলি?orwhere
উত্তর:
orক্লোয়ারের সাথে whereক্লজটির সাথে ধারা অবধি চেইন করার ক্ষমতাটিও রেল 5 এActiveRecord উপলব্ধ । দেখুন সংশ্লিষ্ট আলোচনা ও পুল অনুরোধ ।
সুতরাং, আপনি রেল 5 এ নিম্নলিখিত জিনিসগুলি করতে সক্ষম হবেন :
1 বা 2 postদিয়ে একটি পেতে id:
Post.where('id = 1').or(Post.where('id = 2'))
আরও কয়েকটি উদাহরণ:
(এন্ড এন্ড বি) || সি:
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)))এই (ক || খ) (গ || ঘ) তৈরি করা উচিত &&
ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
এই ORকোয়েরিটি ব্যবহার করার জন্য আমাদের 5 রেলের অপেক্ষা করতে হবে না । আমরা এটি দিয়েও ব্যবহার করতে পারি rails 4.2.3। এখানে একটি ব্যাকপোর্ট আছে ।
আপনাকে ধন্যবাদ এরিক-গুও মণি জন্য যেখানে-অথবা , 'এখন আমরা এই যোগ করতে পারেন ORমধ্যে কার্যকারিতা >= rails 4.2.3এই মণি ব্যবহার করে।
আমার একটা করা দরকার ছিল (A && B) || (C && D) || (E && F)
তবে রেলের 5.1.4বর্তমান অবস্থায় আরেল বা চেইনের সাথে এটি সম্পাদন করা খুব জটিল। তবে আমি এখনও যতটা সম্ভব ক্যোয়ারী তৈরি করতে রেলগুলি ব্যবহার করতে চেয়েছিলাম।
তাই আমি একটি ছোট হ্যাক করেছি:
আমার মডেলটিতে আমি একটি ব্যক্তিগত পদ্ধতি তৈরি করেছি যার নাম রয়েছে 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))।
এবং এখন আমি এটিকে অন্য কোনও স্কোপ ইত্যাদির সাথে খুব সহজেই কোনও ভুল বা ওআর ছাড়া একত্রিত করতে পারি।
যে সৌন্দর্যটি আমার স্কেল_এই জায়গাতেই স্বাভাবিক লাগে যেখানে ক্লজ-আর্গুমেন্টগুলি
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"))