2009-10-02 12 views
65

मैं इस कोडरेल ActiveRecord: वाम साथ जुड़ जाता है भीतर का बजाय शामिल हों शामिल हों

User.find(:all, :limit => 10, :joins => :user_points, 
       :select => "users.*, count(user_points.id)", :group => 
       "user_points.user_id") 

है जो निम्नलिखित उत्पन्न एसक्यूएल

SELECT users.*, count(user_points.id) 
FROM `users` 
INNER JOIN `user_points` 
ON user_points.user_id = users.id 
GROUP BY user_points.user_id 
LIMIT 10 

यह वाम भीतर का बजाय शामिल हों के अलावा अन्य तरह से शामिल हों करना संभव है User.find_by_sql और मैन्युअल टाइपिंग क्वेरी?

उत्तर

82

आप :all एक पदावनत संदेश देता जोड़ने बस भविष्य में संदर्भ के लिए इस

User.find(:all, limit: 10, 
      joins: "LEFT JOIN `user_points` ON user_points.user_id = users.id" , 
      select: "users.*, count(user_points.id)", 
      group: "user_points.user_id") 
+0

महान, मैं –

+0

के लिए वास्तव में क्या देख रहा था यह ठीक है, लेकिन क्या वास्तव में जेकब उस के साथ की उम्मीद है? अंक के बिना उपयोगकर्ता? यदि ऐसा है, तो मुझे लगता है कि इसे 'WHERE user_points.user_id IS NULL' की आवश्यकता है, नहीं? –

+0

@Kylo स्ट्रिंग में टाइप किए बिना बाएं जुड़ने के लिए रेल में एक निर्माण है? – BKSpurgeon

36

कोशिश कर सकते हैं,। रेल के बाद के संस्करणों में आप बस इस तरह के तरीकों श्रृंखला कर सकते हैं:

User.joins("LEFT JOIN `user_points` ON user_points.user_id = users.id").select("users.*, count(user_points.id)").group("user_points.user_id") 

या इस तरह की एक गुंजाइश का उपयोग करें:

scope :my_scope_name_here, -> { 
     joins("LEFT JOIN `user_points` ON user_points.user_id = users.id") 
     .select("users.*, count(user_points.id)") 
     .group("user_points.user_id") 
} 

तुम भी .join और .select के बीच .where श्रृंखला कर सकते हैं। उम्मीद है कि यह भविष्य में किसी की मदद करेगा।

2

रेल 5 में left_outer_joins विधि है। तो तुम

User.left_outer_joins(:user_points) 

करते हैं या उपयोग कर सकते हैं उर्फ ​​

User.left_joins(:user_points)