2014-10-23 13 views
11

क्वेरी मेरी रेल ऐप्लिकेशन में, संग्रह कई परियोजनाओं है, और परियोजनाओं कई कदम है।प्लक जुड़े मॉडल की विशेषता

मैं संग्रह की परियोजनाओं में चरणों के सभी आईडी को पकड़ना चाहता हूं, और मुझे आश्चर्य है कि क्या मैं इसे एक प्रश्न में कर सकता हूं।

उदाहरण के लिए, मैं जानता हूँ कि मैं निम्नलिखित

step_ids = [] 
@collection.projects.each do |project| 
    project.steps.each do |step| 
     step_ids << step.id 
    end 
end 

कर सकते हैं लेकिन यह निम्नलिखित की तरह कुछ करने के लिए संभव है:

@collection.projects.include(:steps).pluck("step.id") // वाक्य रचना यहाँ सही नहीं है

उत्तर

20

इस प्रयास करें :

Step.joins(:project).where(projects: { collection_id: @collection.id }).pluck(:'steps.id') 

के उपयोग पर ध्यान दें जुड़ने के लिए, और फिर projects जहां खंड के लिए। पहला संबंधित संबंधों से संबंधित है, और बाद वाला डीबी टेबल का नाम है।

संपादित करें: एक project_collection (और फिर has_many :collections, through :project_collection)

Step.joins(:project => :project_collection) 
    .where(project_collections: { collection_id: @collection.id }) 
    .pluck(:'steps.id') 
+0

आपकी सहायता के लिए धन्यवाद। परियोजनाएं वास्तव में कई संग्रहों से संबंधित हो सकती हैं, इसलिए परियोजनाओं के लिए कोई संग्रह_आईडी विशेषता नहीं है। आपके सुझाव को बदलने के लिए कोई विचार? – scientiffic

+0

क्या वहां 'projects_collections' तालिका है? आप इसे शामिल करने के लिए शामिल हो सकते हैं .... मैं एक उदाहरण के साथ अपना जवाब संपादित करूंगा। – John

+0

आपके उदाहरण के लिए धन्यवाद - यह मेरे लिए काम करता है! – scientiffic

1

दुर्भाग्य belongs_to परियोजनाओं और संग्रह, और एक परियोजना संभालने के बीच अनेक-से-अनेक संबंध के मामले में, मुझे नहीं लगता कि यह है कि हम एक ही क्वेरी में एआर के माध्यम से ऐसा कर सकता है। डेटाबेस में दो प्रश्नों में इसे पुनर्प्राप्त करने के लिए आप नीचे एक नेस्टेड क्वेरी कर सकते हैं:

Step.includes(:projects).where(projects: { id: Projects.includes(:collections).where(collections: { id: @collections.id }).pluck(:id) }).pluck(:id) 
संबंधित मुद्दे