2010-09-17 8 views
8

को देखते हुएअरेल, कैसे

class Category < ActiveRecord::Base 
    has_many :products, :order => 'name ASC' 
end 

शामिल होने के लिए रेल का उपयोग करते हुए 3 ढेर, मैं सभी श्रेणियों का उत्पाद 'है' के लिए कैसे क्वेरी कर सकते हैं?

उत्तर

13
Category.joins(:products).select("distinct categories.*").all 
+0

यह काम करता है, अच्छा धन्यवाद। – Jan

+0

क्या आपको एआरएल प्रश्नों के साथ क्या संभव है पर एक अच्छा संदर्भ पता है? – Jan

+0

मैं अपने ज्ञान को गुगलिंग से लेता हूं, रेल-एलिट ब्लॉग पढ़ता हूं। महत्वपूर्ण बात: ActiveRecord शुद्ध एरल से बहुत अलग है। – gertas

26

अरेल (नहीं ActiveRecord) में हम क्या करेंगे निम्नलिखित:

p = Arel::Table.new :products # Base Rel-var 
c = Arel::Table.new :categories # Base Rel-var 

predicate = p[:category_id].eq(c[:id]) # for equality predicate 

p.join(c)     # Natural join 
    .on(predicate)   # Equi-Join 
    .group(p[:category_id]) # Grouping expression to get distinct categories 
    .project(c[:id])  # Project the distinct category IDs of the derived set. 
+0

जब आप कहते हैं "एआरएल में (ActiveRecord नहीं)," आपका क्या मतलब है? हम इसे 'ActiveRecord :: Base' से प्राप्त कक्षा में नहीं कर सकते हैं? यह भ्रामक है। –

+0

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

+27

इन सभी उदाहरणों में मैं वास्तविक रिकॉर्ड प्राप्त करने के लिए रेलवे में वापस एआरएलएल क्वेरी को अंतिम चरण में नहीं देखता हूं। पी के साथ अब क्या करना है? आप निश्चित रूप से to_sql पर कॉल कर सकते हैं लेकिन इसे ActiveRecord :: रिलेशन में कैसे बदलना है जो रिकॉर्ड लोड करेगा? – bradgonesurfing

1

एक और, सरल, दृष्टिकोण का उपयोग करने के लिए है ActiveRecord क्वेरी इंटरफ़ेस के join सशर्त बयान के लिए अरेल साथ संयोजन के रूप में:

:
joins(:user) 
.where(User.arel_table[:name].matches("%#{query}%")) 

sqlite3 में निम्नलिखित एसक्यूएल उत्पन्न करता है

और postgres में निम्नलिखित एसक्यूएल (iLike नोटिस):

"SELECT \"patients\".* FROM \"patients\" INNER JOIN \"users\" ON \"users\".\"id\" = \"patients\".\"user_id\" WHERE (\"users\".\"name\" ILIKE '%query%')" 

यह आपको सादगी के साथ शामिल होने के लिए अनुमति देता है, लेकिन अभी भी अपने आरडीबीएमएस को अरेल मिलान की अमूर्त मिलता है।