ruby on rails रेल: polymorphic एसोसिएशन के माध्यम से has_many है-यह काम करेगा?




ruby-on-rails activerecord (2)

आप को करना पड़ेगा:

class Person < ActiveRecord::Base
  has_many :events
  has_many :meals, :through => :events, :source => :eventable,
    :source_type => "Meal"
  has_many :workouts, :through => :events, :source => :eventable,
    :source_type => "Workout"
end

यह आपको ऐसा करने में सक्षम करेगा:

p = Person.find(1)

# get a person's meals
p.meals.each do |m|
  puts m
end

# get a person's workouts
p.workouts.each do |w|
  puts w
end

# get all types of events for the person
p.events.each do |e|
  puts e.eventable
end

एक Person पास कई Events हो सकती हैं और प्रत्येक Event में एक Eventable रिकॉर्ड हो सकता है। मैं Person और Eventable रिकॉर्ड के बीच संबंध कैसे निर्दिष्ट Eventable ?

यहां मेरे मॉडल हैं:

class Event < ActiveRecord::Base
  belongs_to :person
  belongs_to :eventable, :polymorphic => true
end

class Meal < ActiveRecord::Base
  has_one :event, :as => eventable
end

class Workout < ActiveRecord::Base
  has_one :event, :as => eventable
end

मुख्य प्रश्न Person वर्ग से संबंधित है:

class Person < ActiveRecord::Base
  has_many :events
  has_many :eventables, :through => :events  # is this correct???
end

क्या मैं कहता हूं has_many :eventables, :through => :events जैसे has_many :eventables, :through => :events मैंने ऊपर किया था?

या क्या मुझे उन्हें इस तरह से जादू करना है:

has_many :meals, :through => :events
has_many :workouts, :through => :events

यदि आप जो कुछ भी कर रहे हैं उसे पूरा करने का एक आसान तरीका देखते हैं, तो मैं सभी कान हूं! :-)


इसका एक और विकल्प एकल टेबल विरासत (एसटीआई) या मल्टी टेबल विरासत (एमटीआई) पैटर्न का उपयोग करना है, लेकिन इसके लिए कुछ ActiveRecord / DB तालिका पुनर्विक्रय की आवश्यकता होती है, लेकिन इससे अन्य लोगों को यह अभी भी ढूंढने में सहायता मिल सकती है जो इसे पहली बार डिजाइन कर रहे हैं।

रेल 3+ में एसटीआई विधि यहां दी गई है: आपकी इवेंट योग्य अवधारणा एक कक्षा बन जाती है और एक type कॉलम की आवश्यकता होती है (जो रेल आपके लिए स्वचालित रूप से पॉप्युलेट हो जाती है)।

class Eventable < ActiveRecord::Base
  has_one :event
end

फिर, आपके अन्य दो वर्ग एआर :: बेस के बजाय इवेंटेबल से प्राप्त होते हैं

class Meal < Eventable
end

class Workout < Eventable
end

और आपकी घटना वस्तु मूल रूप से वही है, सिर्फ पॉलीमोर्फिक नहीं:

class Event < ActiveRecord::Base
  belongs_to :person
  belongs_to :eventable
end

यह आपकी कुछ अन्य परतों को और अधिक भ्रमित कर सकता है, अगर आपने इसे पहले कभी नहीं देखा है और आप सावधान नहीं हैं। उदाहरण के लिए, यदि आप मार्गों में दोनों एंडपॉइंट्स उपलब्ध /eventable/1 , तो एक एकल भोजन ऑब्जेक्ट को /meals/1 और /eventable/1 पर एक्सेस किया जा सकता है, और जब आप विरासत ऑब्जेक्ट खींचते हैं तो आपको उस कक्षा के बारे में पता होना चाहिए जिसका उपयोग आप कर रहे हैं ( संकेत: यदि आपको डिफ़ॉल्ट रेल व्यवहार को ओवरराइड करने की आवश्यकता है तो हो सकता है कि method बहुत उपयोगी हो)

लेकिन यह मेरे अनुभव में ऐप स्केल के रूप में जिम्मेदारियों की एक बहुत साफ परिभाषा है। विचार करने के लिए बस एक पैटर्न।





polymorphic-associations