2012-01-16 13 views
13

मेरे पास 3 टेबल हैं - उपयोगकर्ता, चीजें, और निम्न। उपयोगकर्ता के साथ user_id को संबद्ध करते हुए, निम्न तालिका के माध्यम से चीजों का पालन कर सकते हैं। इसका मतलब होगा:रेल में टेबल से डेटा की आवश्यकता है, has_many:

class User 
    has_many :things, :through => :follows 
end 

class Thing 
    has_many :users, :through => :follows 
end 

class Follow 
    belongs_to :users 
    belongs_to :things 
end 

तो मैं चीज़.यूसर को बिना किसी समस्या के पुनर्प्राप्त कर सकता हूं। मेरी समस्या यह है कि यदि निम्न तालिका में, मेरे पास "संबंध" नामक एक कॉलम है, इसलिए मैं एक अनुयायी को "व्यवस्थापक" के रूप में सेट कर सकता हूं, मैं उस संबंध तक पहुंच प्राप्त करना चाहता हूं। तो एक लूप में मैं कुछ ऐसा कर सकता हूं:

<% things.users.each do |user| %> 
    <%= user.relation %> 
<% end %> 

क्या मूल उपयोगकर्ता ऑब्जेक्ट में संबंध शामिल करने का कोई तरीका है? मैंने :select => "follows.relation" को आजमाया है, लेकिन ऐसा लगता है कि यह विशेषता में शामिल नहीं है।

+2

यह संबंध "संबंध" नाम देने का एक बहुत बुरा विचार है ... यह कुछ रूबी आंतरिक तोड़ सकता है और आपको अप्रत्याशित व्यवहार मिल जाएगा! – Lichtamberg

+0

ठीक है, धन्यवाद। आइए कहें कि कॉलम का नाम "is_admin" है और इसमें एक प्रकार का बूलियन है .. –

उत्तर

22

ऐसा करने के लिए आपको has_many में कुछ SQL का उपयोग करने की आवश्यकता है। ऐसा कुछ उम्मीद करनी चाहिए। has_many :users, :through => :follows, :select => 'users.*, follows.is_admin as is_follow_admin'

फिर पाश में आप आप की तरह कुछ करने के लिए सक्षम हो सकता है user.is_follow_admin

+0

निश्चित रूप से काम करता है, और अनिवार्य रूप से मैं पहले कोशिश कर रहा था। मेरा लटकाना यह था कि कमांड लाइन पर ऐसा करने पर SQL डंप कहीं भी is_admin विशेषता नहीं दिखाता है .. यह केवल निम्न ऑब्जेक्ट दिखाता है। धन्यवाद! –

+0

+1 - ब्रैडली पुजारी, आपने इसे फिर से किया है। –

+0

+1 विशाल समय बचतकर्ता और बहुत ही सुरुचिपूर्ण, धन्यवाद! –

0

तक पहुंच होनी चाहिए:

<% things.follows.each do |follow| %> 
    <%= follow.relation %> 
    <%= follow.user %> 
<% end %> 
8

रेल 4 का उपयोग लोगों के लिए, का उपयोग: आदेश,: चयन, आदि को हटा दिया गया है। अब आपको निम्नानुसार निर्दिष्ट करने की आवश्यकता है:

has_many :users, -> { select 'users.*, follows.is_admin as is_follow_admin' }, :through => :follows 
संबंधित मुद्दे