কীভাবে আপনি রেলস 3 অ্যাক্টিভেকর্ডে একটি ওআর ক্যোয়ারি করেন। আমি যে উদাহরণগুলি পেয়েছি তার সবেমাত্র ও কোয়েরি রয়েছে।
Post.where(column: 'something').or(Post.where(other: 'else'))
কীভাবে আপনি রেলস 3 অ্যাক্টিভেকর্ডে একটি ওআর ক্যোয়ারি করেন। আমি যে উদাহরণগুলি পেয়েছি তার সবেমাত্র ও কোয়েরি রয়েছে।
Post.where(column: 'something').or(Post.where(other: 'else'))
উত্তর:
আরেল ব্যবহার করুন
t = Post.arel_table
results = Post.where(
t[:author].eq("Someone").
or(t[:title].matches("%something%"))
)
ফলাফল এসকিউএল:
ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT "posts".* FROM "posts" WHERE (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))
matches
উত্পাদন করা হবে LIKE
(ডিফল্টরূপে সংবেদনশীল কেস) এবং পোস্টগ্রিসে ( ILIKE
অপারেটরের মতো স্পষ্ট কেস সংবেদনশীল প্রয়োজন)।
আপনি যদি একটি কলামের মান হিসাবে একটি ওআর অপারেটর ব্যবহার করতে চান, আপনি এতে একটি অ্যারে পাস করতে পারেন .where
এবং অ্যাক্টিভেকর্ডার ব্যবহার করবে IN(value,other_value)
:
Model.where(:column => ["value", "other_value"]
আউটপুট:
SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')
এটি OR
একটি একক কলামে একটি এর সমতুল্য অর্জন করা উচিত
3 রেলগুলিতে, এটি হওয়া উচিত
Model.where("column = ? or other_column = ?", value, other_value)
এটিতে কাঁচা স্কয়ারও অন্তর্ভুক্ত রয়েছে তবে আমি ভাবি না যে অ্যাক্টিভেকর্ডে করার জন্য বা অপারেশন করার কোনও উপায় আছে। আপনার প্রশ্নটি কোন প্রশ্ন নয়।
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
রেলস / অ্যাক্টিভেকর্ডের একটি আপডেট সংস্করণ স্থানীয়ভাবে এই সিনট্যাক্সটিকে সমর্থন করতে পারে। এটি দেখতে অনুরূপ হবে:
Foo.where(foo: 'bar').or.where(bar: 'bar')
এই টান অনুরোধ https://github.com/rails/rails/pull/9052 তে উল্লিখিত হিসাবে
আপাতত, কেবলমাত্র নিম্নলিখিত কাজগুলি দিয়ে আঁকানো দুর্দান্ত:
Foo.where('foo= ? OR bar= ?', 'bar', 'bar')
আপডেট করুন: মতে https://github.com/rails/rails/pull/16052or
বৈশিষ্ট্য পাগল উপলব্ধ হবে 5
আপডেট: বৈশিষ্ট্যটি রেল 5 শাখায় মার্জ করা হয়েছে
or
এখন R টি রেল উপলভ্য রয়েছে তবে এইভাবে প্রয়োগ করা হবে না কারণ এটি 1 টি আর্গুমেন্ট পাস হওয়ার প্রত্যাশা করে। এটি একটি আরেল বস্তুর প্রত্যাশা করে। গৃহীত উত্তরটি দেখুন
or
ActiveRecord পদ্ধতি কাজ করে আপনি এটি সরাসরি ব্যবহার করছেন কিন্তু যদি এটি একটি সুযোগ যা পরে শৃঙ্খলিত করা হয় ব্যবহৃত হচ্ছে আপনার প্রত্যাশা ভেঙ্গে দিতে পারে।
রেলগুলি সম্প্রতি এটি অ্যাক্টিভেকর্ডে যুক্ত করেছে। এটি 5 টি কারাগারে মুক্তি পাবে বলে মনে হচ্ছে ইতোমধ্যে মাস্টার্ড করার প্রতিশ্রুতিবদ্ধ:
https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89
Post.where(column: 'something').or(Post.where(other: 'else'))
# => SELECT * FROM posts WHERE (column = 'something') OR (other = 'else)
5 রেলগুলি একটি or
পদ্ধতি নিয়ে আসে । ( ডকুমেন্টেশনে এল কালি )
এই পদ্ধতিটি কোনও ActiveRecord::Relation
বস্তুকে গ্রহণ করে । উদাহরণ:
User.where(first_name: 'James').or(User.where(last_name: 'Scott'))
আপনি যদি অ্যারেগুলি আর্গুমেন্ট হিসাবে ব্যবহার করতে চান তবে নিম্নলিখিত কোডটি রেল 4 এ কাজ করে:
query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms) SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))
আরও তথ্য: অথবা রেল 4-এ আর্গুমেন্ট হিসাবে অ্যারে নিয়ে প্রশ্ন রয়েছে ।
Order.where(query.where_values.inject(:or))
পুরোপুরি আরেল ব্যবহার করা।
MetaWhere প্লাগইন সম্পূর্ণরূপে আশ্চর্যজনক।
সহজেই ওআর এর এবং এন্ডের মিশ্রিত করুন, যে কোনও সংস্থার শর্তে যোগদান করুন এবং এমনকি আউট জয়েনসও নির্দিষ্ট করুন!
Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
শর্তে কেবল একটি ওআর যুক্ত করুন
Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
আমি কেবলমাত্র ক্লায়েন্টের কাজ থেকে এই প্লাগইনটি বের করেছি যা আপনাকে স্কোপগুলি .or.
প্রাক্তন, একত্রিত করতে দেয় । Post.published.or.authored_by(current_user)
। স্কুয়েল (মেটা অনুসন্ধানের নতুন বাস্তবায়ন) দুর্দান্ত, তবে আপনাকে বা স্কোপগুলিকে বাধা দেয় না, সুতরাং ক্যোয়ারী যুক্তি কিছুটা রিয়ন্ডান্ট পেতে পারে।
রেল + আরেল সহ, আরও স্পষ্ট উপায়:
# Table name: messages
#
# sender_id: integer
# recipient_id: integer
# content: text
class Message < ActiveRecord::Base
scope :by_participant, ->(user_id) do
left = arel_table[:sender_id].eq(user_id)
right = arel_table[:recipient_id].eq(user_id)
where(Arel::Nodes::Or.new(left, right))
end
end
উত্পাদন:
$ Message.by_participant(User.first.id).to_sql
=> SELECT `messages`.*
FROM `messages`
WHERE `messages`.`sender_id` = 1
OR `messages`.`recipient_id` = 1
আমি এটি যুক্ত করতে চাই এটি একটি অ্যাক্টিভেকর্ডের একাধিক বৈশিষ্ট্য অনুসন্ধান করার সমাধান। থেকে
.where(A: param[:A], B: param[:B])
এ এবং বি অনুসন্ধান করবে
Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')