2010-01-18 17 views
6

मेरे पास निम्नलिखित तीन मॉडल हैं: उपयोगकर्ता, प्रोजेक्ट, और असाइनमेंट।has_many में विदेशी कुंजी निर्दिष्ट करना: रिश्ते के माध्यम से

एक उपयोगकर्ता has_many एक असाइनमेंट के माध्यम से परियोजनाएं। हालांकि, असाइनमेंट में वास्तव में दो उपयोगकर्ता से संबंधित विदेशी कुंजी: user_id (उस उपयोगकर्ता का प्रतिनिधित्व करने वाले उपयोगकर्ता का प्रतिनिधित्व करता है) और completer_id (प्रोजेक्ट पूरा करने वाले उपयोगकर्ता का प्रतिनिधित्व करता है)।

अक्सर, user_id और completer_id वही होगा (यदि उपयोगकर्ता को परियोजना को सौंपा गया था)। हालांकि, यदि कोई अन्य उपयोगकर्ता इसे पूरा करता है, तो user_id और fullter_id अलग होगा।

मेरे उपयोगकर्ता मॉडल में, मैं निम्नलिखित है:

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :incomplete_assignments, :class_name => 'Assignment', 
    :conditions => 'completer_id IS NULL' 
    has_many :completed_assignments, :class_name => 'Assignment', 
    :foreign_key => 'completer_id' 

    # this is the important one 
    has_many :incomplete_projects, 
    :through  => :assignments, 
    :source  => :project, 
    :conditions => 'completer_id IS NULL' 
end 

मैं एक संघ बनाने के लिए चाहते हैं, :completed_projects, जो :through मॉडल में उपयोगकर्ता के लिए विदेशी कुंजी के रूप में completer_id का उपयोग करता है, बजाय :user_id बुलाया । क्या इसे करना संभव है?

और, एक तरफ के रूप में, मुझे :foreign_key विकल्प से अवगत है। हालांकि, :through का उपयोग करते समय, इस विकल्प को अनदेखा किया जाता है, इसलिए मैं जानना चाहता हूं कि इसके बिना ऐसा करने का कोई तरीका है या नहीं।

अंत में, मुझे यह उल्लेख करना चाहिए कि मैं अन्य डिज़ाइनों के लिए खुला हूं, अगर ऐसा नहीं किया जा सकता है और कोई बेहतर तरीके से सोच सकता है।

+4

आपका स्वागत है। :) – hobodave

उत्तर

3

तुम हमेशा के चयन के लिए एसक्यूएल का उपयोग कर सकते ActiveRecord आसानी से बॉक्स से बाहर संबंध व्यक्त नहीं कर सकते हैं:

has_many :completed_projects, 
:class_name => "Project", 
:finder_sql => 'SELECT p.* FROM projects p ' + 
    'INNER JOIN assignments a ON p.id=a.project_id ' + 
    'INNER JOIN users u on u.id=a.completer_id ' + 
    'WHERE u.id=#{id}' 
+0

मैं जो कह सकता हूं उससे, यह करने का यही एकमात्र तरीका है। इसके लिए एक गुच्छा धन्यवाद। दुर्भाग्य से – jakeboxer

+0

का उपयोग करके: finder_sql ब्रेकिंग ब्रेकिंग। 'user.completed_projects.limit (2) 'काम नहीं करेगा। –

2

आप अपने कार्य तालिका के अन्य मेटा डेटा है?

यदि नहीं, तो मैं बस habtm का उपयोग करता हूं और इसके बजाय प्रोजेक्ट टेबल में fullter_id जोड़ता हूं, वैसे भी वहां रहने का अर्थ होता है।

आप की जरूरत/तो has_many का उपयोग करना चाहते: के माध्यम से आप named_scopes (रेल की अनुमति संस्करण) का उपयोग पर दिखाई दे सकता है तो आप कह सकते हैं कुछ मामूली ActiveRecord के साथ जटिल करने के लिए कोशिश कर रहा करने के लिए user.projects.completed और user.projects.incomplete

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