Rails3

2011-01-07 11 views
14

में .where विधि का उपयोग करके मैंने अभी .where विधि का उपयोग शुरू कर दिया है, और मैं थोड़ा पूरी तरह से इसका उपयोग करने के बारे में उलझन में हूं।Rails3

मैं की तरह कुछ करने के लिए करना चाहते हैं:

@books = Book.where(:author_id => 1 || 2) 

स्पष्ट रूप से मुझे पता है कि काम नहीं करता है, लेकिन मैं प्रदर्शन करने के लिए है कि मैं कुछ अतिरिक्त तर्क यहाँ चाहते कोशिश कर रहा हूँ। कुछ "या" "और" "बराबर नहीं है" आदि

कोई विचार जहां मैं इसका शोध कर सकता हूं? मैं रेल एपीआई में देख रहा था लेकिन मैंने कुछ भी नहीं देखा जो सहायक था।

धन्यवाद! , स्थिति, आदि ताकि आप की तरह कुछ कर सकते हैं::

उत्तर

26
क्योंकि कि अभिव्यक्ति से पहले समारोह कॉल मूल्यांकन किया जाता है

1 || 2 काम नहीं करेगा (यह 1 का मूल्यांकन की अनुमति देता है, तो यह Book.where(:author_id => 1) के बराबर होना चाहिए मुझे क्या करना होगा:।।

@books = Book.where(:author_id => [1, 2]) 

उत्पन्न एसक्यूएल WHERE author_id IN (1, 2) होगा

012,
+0

अरे कैम, कि काम बहुत धन्यवाद! किसी भी विचार के लिए कि मैं कहां उपयोग कर सकता हूं, या "और" या "बराबर नहीं है" प्रकार तर्क प्राप्त करने के लिए एक अलग विधि? – Elliot

+0

अरे इलियट, दुर्भाग्यवश, हैश तर्क 'जहां' का समर्थन नहीं करता है 'प्रकार के बराबर नहीं है' प्रकार देखें (http://guides.rubyonrails.org/active_record_querying.html देखें "केवल समानता, सीमा और सबसेट जांच संभव है हैश की स्थिति। ")। जहां तक ​​"और" प्रश्न पूछते हैं, बस अपने हैश में एक और कुंजी जोड़ें ताकि: 'Book.where (: author_id => [1, 2],: बेस्टसेलर => सत्य)' जहां 'लेखक_आईडी में संकलित होगा (1, 2) और बेस्टसेलर सत्य है) ' – cam

+0

इसे मोंगोइड के लिए कैसे संशोधित किया जाना चाहिए –

3

स्रोत को देखते हुए (! कोई सभ्य प्रलेखन), आप एसक्यूएल, जिसके लिए एसक्यूएल की तरह parameterized किया जा सकता है के माध्यम से पारित कर सकते हैं

@books = Book.where("author_id = 1 OR author_id = 2") 

नहीं कच्चे एसक्यूएल को छोड़ने के लिए आदर्श है, लेकिन मैं कहां विधि का उपयोग कर इसे करने के लिए एक और अधिक सुरुचिपूर्ण तरीका नहीं देख सकता। MetaWhere, https://github.com/ernie/meta_where पर

Source and absence of documentation here

+0

मैं क्या करना होगा '@books = Book.where (" author_id =? या author_id =? ", 1, 2)' – DemitryT

4

देखो - इस बात की इस प्रकार की काफी बड़े करीने से :)

1

ऐसा लगता है कि आप अधिक जटिल चीजों के लिए अरेल को देखना चाहेंगे। यह पहले से ही रेल 3 में बनाया गया है (एआर आंतरिक रूप से इसका उपयोग करता है)।

book = Book.arel_table 
# range 
Book.where(book[:author_id].gt(0).and(book[:author_id].lt(3)) 

#or 
Book.where(b[:author_id].eq(0).or(t[:author_id].eq(3).order(:first_name)) 

#joins 
book.join(authors).on(book[:author_id].eq(author[:id])). 
    where(book[:title].matches 'hokum n stuff') 

इसके अलावा समूह, एकत्रीकरण और भी बहुत कुछ। दोष यह है कि दस्तावेज स्पैस है। docs

tests

संबंधित मुद्दे