Ruby on Rails 5.2 - ActiveRecord::Querying

मॉड्यूल ActiveRecord :: क्वेरी




ruby

मॉड्यूल ActiveRecord :: क्वेरी

सार्वजनिक प्रवृत्ति के तरीके

# File activerecord/lib/active_record/querying.rb, line 67
def count_by_sql(sql)
  connection.select_value(sanitize_sql(sql), "#{name} Count").to_i
end

SQL कथन का परिणाम देता है जिसमें केवल SELECT भाग में एक COUNT (*) शामिल होना चाहिए। इस विधि का उपयोग जटिल SQL प्रश्नों को प्रतिबंधित किया जाना चाहिए जिन्हें ActiveRecord::Calculations वर्ग विधियों का उपयोग करके निष्पादित नहीं किया जा सकता है। इसका उपयोग करने से पहले उन पर गौर करें।

Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
# => 12

पैरामीटर

  • sql - एक SQL स्टेटमेंट जो डेटाबेस से एक काउंट क्वेरी वापस करना चाहिए, ऊपर उदाहरण देखें।

find_by_sql (sql, binds = [], तैयार करने योग्य: nil, & block) शो सोर्स
# File activerecord/lib/active_record/querying.rb, line 40
def find_by_sql(sql, binds = [], preparable: nil, &block)
  result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
  column_types = result_set.column_types.dup
  cached_columns_hash = connection.schema_cache.columns_hash(table_name)
  cached_columns_hash.each_key { |k| column_types.delete k }
  message_bus = ActiveSupport::Notifications.instrumenter

  payload = {
    record_count: result_set.length,
    class_name: name
  }

  message_bus.instrument("instantiation.active_record", payload) do
    result_set.map { |record| instantiate(record, column_types, &block) }
  end
end

अपने डेटाबेस के खिलाफ एक कस्टम SQL क्वेरी निष्पादित करता है और सभी परिणाम देता है। परिणाम उस कॉलम के साथ एक सरणी के रूप में लौटाए जाएँगे, जो आपके द्वारा इस विधि को कॉल करने वाले मॉडल की विशेषताओं के रूप में इनकैप्सुलेट किए गए हैं। यदि आप Product.find_by_sql कॉल करते हैं, तो परिणाम SQL ऑब्जेक्ट में आपके द्वारा निर्दिष्ट विशेषताओं के साथ Product ऑब्जेक्ट में वापस आ जाएंगे।

यदि आप एक जटिल SQL क्वेरी को कहते हैं, जो कई तालिकाओं का चयन करती है, जो SELECT द्वारा निर्दिष्ट कॉलम मॉडल के गुण हैं, तो वे संबंधित तालिका के कॉलम हैं या नहीं।

sql पैरामीटर एक स्ट्रिंग के रूप में एक पूर्ण SQL क्वेरी है। इसे वैसा ही कहा जाएगा, जैसे कोई डेटाबेस एग्नॉस्टिक रूपांतरण नहीं होगा। यह एक अंतिम उपाय होना चाहिए क्योंकि उदाहरण के लिए, MySQL के विशिष्ट शब्द आपको उस विशेष डेटाबेस इंजन का उपयोग करने के लिए लॉक कर देंगे या यदि आप इंजन स्विच करते हैं तो आपको अपना कॉल बदलने की आवश्यकता होगी।

# A simple SQL query spanning multiple tables
Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
# => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]

आप उसी स्ट्रिंग प्रतिस्थापन तकनीकों का उपयोग कर सकते हैं जैसा कि आप ActiveRecord::QueryMethods#where साथ कर सकते हैं:

Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]