2013-04-08 5 views
6

मेरे पास मेरी रेल में निम्न डेटा मॉडल 2.3 आवेदनरेल के पास है: के माध्यम से। बिल्डिंग जुड़े वस्तु

class PortraitSubject 
    has_many :portraits 
    has_one  :primary_portrait, :through => :portraits, :source => :asset, :conditions => ['portraits.primary = ?', true] 
    has_many :supplementary_portraits, :through => :portraits, :source => :asset, :conditions => ['portraits.primary = ?', false] 

    ... 
end 

class Portrait 
    belongs_to :portrait_subject 
    belongs_to :asset 

    ... 
end 

मैं रेल का उपयोग कर, लेकिन primary_portrait एक अपवाद के साथ विफल बनाने की कोशिश जुड़े प्रॉक्सी मॉडल का निर्माण करना चाहते हैं। अर्थात।

# This works 
subject = PortraitSubject.new 
subject.supplementary_portraits.build 
subject.save 

# This doesn't 
subject = PortraitSubject.new 
subject.build_primary_portrait 
# => NoMethodError: undefined method `build_primary_portrait' for #<PortraitSubject:0x007ff16fe38948> 

मुझे यकीन है कि मैं गलत क्या कर रहा नहीं हूँ। रेल गाइड के माध्यम से देखकर ऐसा लगता है कि यह has_one रिलेशनशिप के साथ संभव होना चाहिए। किसी भी तरह की सहायता का स्वागत किया जाएगा।

+1

बारे में क्या आप वाकई 'का निर्माण कर सकते हैं: through' संघों? यदि आप कृपया एक लिंक प्रदान करते हैं – Zippie

उत्तर

0

निम्नलिखित क्यों नहीं करें।

class Portrait 
    belongs_to :portrait_subject 
    belongs_to :asset 

    ... 
end 

-

class PrimaryPortrait < Portrait 
    ... 
end 

-

class SupplementaryPortraits < Portrait 
    ... 
end 

-

class PortraitSubject 
    has_one  :primary_portrait 
    has_many :supplementary_portraits 
    ... 
end 

यह और अधिक बारीकी से रेल डिजाइन पैटर्न इस प्रकार है। हालांकि आपको एक प्रकार का कॉलम जोड़ना होगा।

0

मैं बंटवारे इस दो संघों में सुझाव देंगे:

class PortraitSubject 
    has_many :portraits 
    has_one  :primary_portrait, :class_name => "Portrait", :conditions => ['portraits.primary = ?', true] 
    has_one  :primary_portrait_asset, :through => :primary_portrait, :source => :asset 

    has_many :supplementary_portraits, :class_name => "Portrait", :conditions => ['portraits.primary = ?', false] 
    has_many  :supplementary_portrait_assets, :through => :supplementary_portraits, :source => :asset 

    ... 
end 

तो फिर तुम subject.build_primary_portrait का उपयोग चित्र मॉडल बनाने के लिए कर सकते हैं और subject.primary_portrait_asset के माध्यम से अपनी संपत्ति का उपयोग।

1

आप उन नामकरण सम्मेलनों के साथ पागल होने जा रहे हैं। PrimaryPortrait और SecondaryPortraitPortrait के विशेष मामले होना चाहिए जो Portrait से संबंधित संपत्ति नहीं है। यह पहले से ही आपके डिजाइन को तोड़ रहा है कि आप एक नहीं बना सकते हैं।

इस प्रयास करें:

class PortraitSubject 
    has_many :portraits 
    has_one  :primary_portrait, :conditions => {:primary => true} 
    has_many :supplementary_portraits, :conditions => {:primary => false} 

    has_many :portrait_assests, :through => :portraits 
    has_one  :primary_portrait_asset, :through => :primary_portrait 
    has_many :supplementary_portrait_assets, :through => :supplementary_portraits 

end 

तो, यदि आप एक primary_portait_asset का निर्माण करने की जरूरत है एक उदाहरण विधि

def build_primary_portrait_asset 
    primary_portrait || build_primary_portrait 
    primary_portrait.asset || primary_portrait.build_asset 
end 
संबंधित मुद्दे