मेरे पास एक उत्पाद है, और एक उत्पाद में कई छवियां हो सकती हैं। यह एक एसोसिएशन टेबल के माध्यम से है। हालांकि, मैं एक उत्पाद को एक मुख्य छवि रखना चाहता हूं।रेल है has_many एसोसिएशन
मुझे पता है कि मॉडल में एक विधि के साथ करना बहुत आसान है, लेकिन मैं इसे एक एसोसिएशन बनना चाहता हूं ताकि मैं इसे include
का उपयोग कर क्वेरी में प्रीलोड कर सकूं।
मॉडल:
class Product < ActiveRecord::Base
has_many :image_associations, :as => :imageable
has_many :images, :through => :image_associations
end
class ImageAssociation < ActiveRecord::Base
belongs_to :image
belongs_to :imageable, :polymorphic => true
end
class Image < ActiveRecord::Base
has_many :image_associations
end
ImageAssociation तालिका में, वहाँ एक बूलियन स्तंभ 'सुविधा' नामक जो 'मुख्य' छवि के रूप में एक छवि संबद्ध करती है।
belongs_to :image, :class => "Image", :foreign_key => "main_image_id"
बहरहाल, यह किसी भी वापस आने के लिए अनुमति नहीं देता:
तरीके मैं यह कर रहा उत्पादों तालिका में एक main_image_id
कॉलम शामिल है, और फिर Image
मॉडल को जोड़ने के बारे में सोचा है में से एक यदि मुख्य छवि शून्य है - जिसे मैं एसोसिएशन लोड करना चाहता हूं, तो दूसरी है Imany छवियों के लिए।
इसीलिए मैं की तरह छवियों मॉडल में कुछ करने के लिए उम्मीद कर रहा था:
has_one :image, :through => :images, :conditions => 'feature = true', :order => 'created_at DESC'
लेकिन वह मुझे एक संघ त्रुटि देता है।
क्या कोई तरीका है कि मैं इसे संपादित कर सकता हूं, या क्या मुझे वास्तव में प्रत्येक मुख्य_image_id फ़ील्ड में एक छवि को धक्का देने के लिए एक रेक कार्य चलाने की आवश्यकता है, और फिर भविष्य में उत्पादों के लिए एक सत्यापन जोड़ें ताकि यह सुनिश्चित किया जा सके कि मुख्य छवि जोड़ा गया है ?
संपादित करें:
मैं बजाय एक has_and_belongs_to_many
संघ प्रयोग करना चाहिए?
नहीं। वांछित होने पर संग्रह के लिए आप अन्य फ़िल्टर किए गए has_many एसोसिएशन के साथ ऐसा कर सकते हैं, लेकिन has_one निर्दिष्ट नहीं करते हैं। यह त्रुटि होती है: 'ActiveRecord :: HasOneThroughCantAssociateThroughCollection: has_one नहीं हो सकता है: एसोसिएशन' आलेख # छवि 'के माध्यम से जहां: एसोसिएशन के माध्यम से' आलेख # image_associations 'एक संग्रह है। इसके बजाय विकल्प के माध्यम से हैसोन या संबंधित_to एसोसिएशन निर्दिष्ट करें। 'पहले से ही कोशिश की थी। –
आह, मैं देख सकता हूं। मुझे एक संपादन करने की कोशिश करते हैं। – Chowlett
पहली पंक्ति में सुधार- ': has_one: main_image_assoc,: class_name =>" ImageAssociation ",: order => 'feature = true',: as =>: imageable' ... यह फ़ॉलबैक (और सही वाक्यविन्यास) के लिए अनुमति देता है । धन्यवाद! –