आप RAIL 3 ActiveRecord में OR क्वेरी कैसे करते हैं। मेरे द्वारा खोजे गए सभी उदाहरणों में केवल और प्रश्न हैं।
संपादित करें: या विधि रेल 5 से उपलब्ध है। ActiveRecord :: QueryMethods देखें
Post.where(column: 'something').or(Post.where(other: 'else'))
आप RAIL 3 ActiveRecord में OR क्वेरी कैसे करते हैं। मेरे द्वारा खोजे गए सभी उदाहरणों में केवल और प्रश्न हैं।
संपादित करें: या विधि रेल 5 से उपलब्ध है। ActiveRecord :: QueryMethods देखें
Post.where(column: 'something').or(Post.where(other: 'else'))
जवाबों:
ARel का प्रयोग करें
t = Post.arel_table
results = Post.where(
t[:author].eq("Someone").
or(t[:title].matches("%something%"))
)
परिणामी SQL:
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उत्पादन करेगा । LIKEILIKE
यदि आप किसी स्तंभ के मान पर OR ऑपरेटर का उपयोग करना चाहते हैं, तो आप किसी सरणी को पास कर सकते हैं .whereऔर ActiveRecord उपयोग करेंगे 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)
इसमें कच्चा sql भी शामिल है लेकिन मुझे नहीं लगता कि ORR ऑपरेशन करने के लिए ActiveRecord में कोई तरीका है। आपका सवाल एक शोर सवाल नहीं है।
Page.where("pages.column = ? or pages.other_column = ?", value, other_value)
रेल / ActiveRecord का एक अद्यतन संस्करण इस वाक्यविन्यास का मूल रूप से समर्थन कर सकता है। यह समान दिखाई देगा:
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/16052 के अनुसार यह orसुविधा रेल 5 में उपलब्ध होगी
अपडेट: फीचर को रेल्स 5 शाखा में विलय कर दिया गया है
orअब उपलब्ध है रेल 5 लेकिन इस तरह से लागू नहीं किया जाता है क्योंकि यह 1 तर्क पारित होने की उम्मीद करता है। यह एक Arel वस्तु की अपेक्षा करता है। स्वीकृत उत्तर देखें
orActiveRecord में विधि यह काम करती है यदि आप इसे सीधे उपयोग कर रहे हैं: लेकिन आपकी अपेक्षाओं को तोड़ सकता है यदि इसे उस दायरे में उपयोग किया जाता है जो तब जंजीर है।
रेल्स ने हाल ही में इसे 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 प्लगइन पूरी तरह से अद्भुत है।
आसानी से OR और AND को मिलाएं, किसी भी एसोसिएशन में शर्तों को शामिल करें, और यहां तक कि OUTER JOIN's निर्दिष्ट करें!
Post.where({sharing_level: Post::Sharing[:everyone]} | ({sharing_level: Post::Sharing[:friends]} & {user: {followers: current_user} }).joins(:user.outer => :followers.outer}
बस शर्तों में एक OR जोड़ें
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
Book.where.any_of(Book.where(:author => 'Poe'), Book.where(:author => 'Hemingway')