5 টি পাগল: অ্যাক্টিভেকর্ড বা কোয়েরি


109

আপনি কীভাবে রেলস 5 অ্যাক্টিভেকর্ডে একটি orকোয়েরি করবেন? এছাড়া, এটিও শৃঙ্খল করা সম্ভব সঙ্গে ActiveRecord ক্যোয়ারীগুলি?orwhere


উত্তর:


228

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)

3
আমি কীভাবে (এ || বি) এবং& (সি || ডি) পেতে পারি? আমি পোস্ট.হোয়ার (ক) .ও (পোস্ট.হোয়ার (খ))। যেখানে (গ) .ও (পোস্ট.হোয়ার (ডি)) চেষ্টা করেছি তবে এটি তৈরি করে: (এ || বি) && সি || ডি
ইমরান আহমদ

3
@Imran আমি বিশ্বাস এটি হবে Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))এই (ক || খ) (গ || ঘ) তৈরি করা উচিত &&
engineersmnky

1
@ ইমরান এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে: আমি পেয়েছিArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
সুয়ান

5
.Or এর সমতুল্য যা একটি সম্পর্ক নেয় এবং একটি উত্পাদন করে এবং ডুবে যায়। (এ || বি) এবং& (সি || ডি) পোস্ট.হোয়ার (ক) দ্বারা উত্পাদিত হতে পারে or )))
সিয়াম লইজার

2
@MathieuJ। এটি অ্যাক্টিভেকর্ড :: রিলেশন # মার্জ। api.rubyonrails.org/classes/AtivetiveRecord/…
সিম লিসার

13

এই ORকোয়েরিটি ব্যবহার করার জন্য আমাদের 5 রেলের অপেক্ষা করতে হবে না । আমরা এটি দিয়েও ব্যবহার করতে পারি rails 4.2.3। এখানে একটি ব্যাকপোর্ট আছে

আপনাকে ধন্যবাদ এরিক-গুও মণি জন্য যেখানে-অথবা , 'এখন আমরা এই যোগ করতে পারেন ORমধ্যে কার্যকারিতা >= rails 4.2.3এই মণি ব্যবহার করে।


6

(কে এম রকিবুল ইসলামের উত্তরের কেবল একটি সংযোজন))

স্কোপগুলি ব্যবহার করে কোডটি সুন্দর হয়ে উঠতে পারে (চোখের উপর নির্ভর করে):

scope a,      -> { where(a) }
scope b,      -> { where(b) }

scope a_or_b, -> { a.or(b) }

5

আমার একটা করা দরকার ছিল (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(...)
নিয়েছি

একত্রীকরণ ব্যবহার করার আগে এটি ব্যবহার করে দেখুন - github.com/rails/rails/issues/33501
Aarthi

1

5 রেলগুলিতে orক্লজ সহ ক্ষমতা রয়েছে where। উদাহরণ স্বরূপ.

User.where(name: "abc").or(User.where(name: "abcd"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.