मैं https://guides के माध्यम से अनुसरण करने का प्रयास कर रहा हूं .rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables

मेरे पास एक वर्ग है, छवि चयन, जिसमें एक स्थिति है जो 'सक्रिय' हो सकती है। यह वर्ग एक छवि से संबंधित है, जिसमें 'वर्कफ़्लो_स्टेट' नामक विशेषता है।

मेरे पास निम्नलिखित है जो काम करता है लेकिन निष्पादित करने में कुछ सेकंड लेता है:

def self.published
  where(status: STATUS_ACTIVE).select { |x| x.image.workflow_state == Publishable::Meta.published_key }
end

निम्नलिखित काम नहीं करता है:

scope :published, lambda {
  where(status: STATUS_ACTIVE).joins(:image).where(
    'image.workflow_state = ?', Publishable::Meta.published_key
  )
}

और रिटर्न:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'image.workflow_state' in 'where clause': SELECT  `image_containers`.* FROM `image_containers` INNER JOIN `images` ON `images`.`id` = `image_containers`.`image_id` WHERE `image_containers`.`status` = 'active' AND (image.workflow_state = 'published') ORDER BY `image.containers`.`id` ASC LIMIT 1

मैं उलझन में हूं क्योंकि छवि तालिका में वर्कफ़्लो_स्टेट है

कोई भी मदद बहुत ही सराहनीय होगी

1
Mark 9 अक्टूबर 2018, 18:30

2 जवाब

सबसे बढ़िया उत्तर

यदि आप सादा एसक्यूएल का उपयोग कर रहे हैं तो आपको बहुवचन तालिका नामों का उपयोग करना चाहिए।

बदलें: image.workflow_state से images.workflow_state

2
Зелёный 9 अक्टूबर 2018, 18:41

मेरे पास निम्नलिखित है जो काम करता है लेकिन निष्पादित करने में कुछ सेकंड लेता है:

self.published विधि से क्वेरी status: STATUS_ACTIVE के साथ सभी रिकॉर्ड प्राप्त करती है, और फिर परिणामी सरणी को स्कैन करती है, जो image.workflow_state दिए गए हैं। तो यह परिणाम प्राप्त करता है जिसे select के साथ फेंक दिया जाएगा, जो संसाधनों की बर्बादी है। क्या बुरा है, प्रत्येक पंक्ति के लिए यह एक ActiveRecord ऑब्जेक्ट बनाता है और डेटाबेस को इसके image एसोसिएशन लाने के लिए एक अतिरिक्त अनुरोध करता है। यह कुख्यात N + 1 पैटर्न समस्या है।

इसे ठीक करने के लिए आपको अपनी क्वेरी को फिर से लिखना होगा:

  joins(:image).where(status: STATUS_ACTIVE, images: { workflow_state: Publishable::Meta.published_key } )
2
Ilya Konyukhov 9 अक्टूबर 2018, 18:41