2015-03-30 6 views
5

मैं एक स्पष्ट रेल 4 उदाहरण चाहता हूं कि किसी अन्य तालिका के माध्यम से उनके द्वारा जुड़े डेटा के आधार पर रिकॉर्ड कैसे फ़िल्टर करें।रेल क्वेरी: किसी अन्य तालिका में गुणों द्वारा फ़िल्टर करें

मान लीजिए मेरे पास एक उपयोगकर्ता मॉडल और एक टिप्पणी मॉडल है। उपयोगकर्ता has_many टिप्पणियां, और एक टिप्पणी belongs_to उपयोगकर्ता। एक टिप्पणी में इसकी तालिका में score कॉलम भी है।

class User < ActiveRecord::Base 
    has_many :comments 
end 

Users 
| id | name | email    | 
|-----|---------|---------------------| 
| 1 | "Alice" | "[email protected]" | 
| 2 | "Bob" | "[email protected]" | 
| ...         | 

class Comment < ActiveRecord::Base 
    belongs_to :user 
end  

Comments 
| id | score | content   | user_id | 
|-----|-------|------------------|---------| 
| 1 | 0  | "lol"   | 2  | 
| 2 | 2  | "more like love" | 3  | 
| ...          | 

मैं कैसे सभी उपयोगकर्ताओं है कि सामग्री "कश्मीर" स्कोर> 0 है के साथ एक टिप्पणी बना दिया है प्राप्त होगा? ध्यान दें कि मैं जो वापस करना चाहता हूं वह उपयोगकर्ता है, टिप्पणियां नहीं।


इसके अलावा, एक अधिक जटिल उदाहरण पर विचार करें, जहां एक उपयोगकर्ता has_many टिप्पणियों और पसंद करता है, टिप्पणियाँ belong_to एक उपयोगकर्ता, और एक टिप्पणी has_many पसंद करती है। belong_to पसंद करता है उपयोगकर्ता और belong_to एक टिप्पणी। ध्यान दें कि score इस उदाहरण में अब कोई कारक नहीं है।

class User < ActiveRecord::Base 
    has_many :comments 
    has_many :likes 
end 

Users 
| id | name | email    | 
|-----|---------|---------------------| 
| 1 | "Alice" | "[email protected]" | 
| 2 | "Bob" | "[email protected]" | 
| ...         | 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    has_many :likes 
end 

Comments 
| id | content   | user_id | 
|-----|------------------|---------| 
| 1 | "lol"   | 2  | 
| 2 | "more like love" | 3  | 
| ...        | 

class Like < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :comment 
end 

Likes 
| id | user_id | comment_id | 
|-----|---------|------------| 
| 1 | 1  | 2   | 
| 2 | 4  | 3   | 
| ...      | 

इस दूसरे उदाहरण में, मैं सभी उपयोगकर्ता है जो कभी उनकी टिप्पणी से एक 'Fonzie' नाम उपयोगकर्ता द्वारा पसंद था कि कैसे मिलेगा?

उत्तर

4

अपने पहले प्रश्न का उत्तर देने के लिए। आपको एक नई सारणी संरचना तैयार करने की आवश्यकता है जो उपयोगकर्ताओं और टिप्पणियों के बीच संबंधों का संदर्भ देता है।

यह User.joins(:comments) द्वारा प्राप्त किया जा सकता है। अब आपके पास एक सारणी है जिसमें सभी उपयोगकर्ता अपनी संबंधित टिप्पणियों के साथ हैं। अपने फिल्टर लागू करने के लिए आप बस कर सकते हैं:

User.joins(:comments) .where("comments.content = ? AND comments.score > ?", 'some_content', 0)

आप ऊपर से परिचित नहीं हैं, तो मैं सुझाव है कि आप rails guidelines on queries पढ़ें - खोज 'में शामिल होने से टेबल्स'

के बाद से दूसरा उदाहरण एक है के लिए थोड़ा और जटिल, मैं सुझाव दूंगा कि आप ऊपर दिए गए गाइड के साथ पहले स्वयं को परिचित करें।

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