2010-01-29 17 views
5

मान लीजिए कि मेरे पास इस तरह की बहुलक संरचना है।रेल - संक्षेप में बहुरूप रूप से नेस्टेड संसाधन के पेरेंट संसाधन को ढूंढना

map.resources :bar, :has_many => :foo 
map.resources :baz, :has_many => :foo 
map.resources :qux, :has_many => :foo 

class Foo 
    belongs_to :parent, :polymorphic => true 
end 

class FooController < AC 
before_filter :find_parent 

... 

private 
def find_parent 
    # ugly way: 
    @parent = if params[:bar_id] 
    Bar.find(params[:bar_id]) 
    elsif params[:baz_id] 
    Baz.find(params[:baz_id]) 
    elsif params[:qux_id] 
    Qux.find(params[:qux_id]) 
    end 
end 
end 

यह बहुत बदसूरत है। जब भी हम एक नई चीज जोड़ते हैं, जो इससे संबंधित हो, तो हमें इसे पहले से_फिल्टर में जोड़ना होगा।

यह भी बदतर हो जाता है। मान लीजिए कि फूस वास्तव में पॉलिमॉर्फिक चीजें हैं जो टिप्पणियां या टैग जैसी कहीं भी दिखाई दे सकती हैं। और लगता है कि आप निम्नलिखित मार्गों है:

map.resources :bar, :has_many => :foo do |bar| 
bar.resources :baz, :has_many => :foo 
end 
map.resources :qux, :has_many => :foo do |qux| 
qux.resources :baz, :has_many => :foo 
end 

... अब हम चाहे पहले bar_id या baz_id के लिए जाँच करने के बारे में चिंता करने की ज़रूरत।

अधिक जटिल संसाधनों के लिए, यह संभव है कि यह सुनिश्चित करने के लिए पर्याप्त नहीं होगा कि आप माता-पिता की आईडी प्राप्त करें।

def get_parent 
# fetch the parameter that immediately preceeded :id 
@parent = if x = params.before(:id) 
    # polymorphic find 
    x.key.to_s[0..-4].classify.constantize.find x.value 
end 
end 

सब के बाद, हमारे मार्गों पहले से ही URL में पैरामीटर के आदेश के आधार पर माता पिता के सांकेतिक शब्दों में बदलना:

क्या आदर्श होगा अगर हम कुछ इस तरह कर सकता है। उस जानकारी को क्यों छोड़ दें?

तो: यह कैसे किया जा सकता है?

+0

आप अंत किया था यह करने के लिए एक सूखी राह तलाशने? – hornairs

उत्तर

4

आप foo.parent

आप कुछ इस तरह की आवश्यकता होगी के लिए पूछने के लिए सक्षम होना चाहिए:

class Bar < ActiveRecord::Base 
    has_many :foos, :as => :parent 
    ... 
end 
+0

हां, इस तरह आप निश्चित रूप से जान लेंगे कि आपको अपने foo का असली अभिभावक मिल गया है। चूंकि उपयोगकर्ता यूआरएल में कुछ भी पास कर सकता है और आपको परिभाषित फू के लिए कोई बार/बाज/क्यूक्स मिल जाएगा)। – Eimantas

+0

यह आवश्यक रूप से कुछ प्रकार के has_many polymorphy में काम नहीं करेगा, और यह नए रिकॉर्ड के लिए बिल्कुल काम नहीं करेगा। पूर्व के लिए, मान लीजिए कि एक बार और बार दोनों के बीच एक एकल फू साझा किया जाता है, और मुझे यह बताना होगा (एक विशेष अनुरोध के लिए) जो एक प्रभावी था। – Sai

+0

FooController # अनुक्रमणिका के लिए भी काम नहीं करता है (जिसे यह जानने की आवश्यकता है कि कौन से माता-पिता के प्रश्न पूछने के लिए foos)। – Sai