2011-08-11 22 views
5

मैं रेल में एक ब्लॉग इंजन लिख रहा हूं, और एक टैग मॉडल और एक पोस्ट मॉडल स्थापित किया है जिसमें have_and_belongs_to_many रिश्ते हैं। टैग एडिशन ठीक काम करता है, समस्या तब होती है जब एक विशिष्ट टैग के साथ सभी पोस्ट की तलाश होती है:रेल में टैग कार्यान्वित करना: एक टैग के साथ एकाधिक वस्तुओं का संदर्भ कैसे लें?

यदि मैं पोस्ट ए को टैग "टेस्ट" जोड़ता हूं, तो बी पोस्ट करने के लिए टैग "टेस्ट" जोड़ें, दो टैग ऑब्जेक्ट्स हैं, दोनों नाम "परीक्षण" के साथ लेकिन अलग-अलग आईडी के साथ, दोनों अलग-अलग पदों का संदर्भ देते हैं। अब अगर मेरे पास नियंत्रक एक्शन इंडेक्सटागपोस्ट है जो पैरामीटर "टैग" लेता है और उस टैग के साथ सभी पोस्ट पाता है, तो यह केवल एक पोस्ट लौटाएगा, क्योंकि दूसरे टैग में एक अलग आईडी है और वास्तव में यह जुड़ा हुआ नहीं है। क्या मुझे किसी भी तरह से नए टैग जोड़ने के लिए प्रतिबंधित करना चाहिए, या क्या मैं सभी प्रासंगिक टैगों को अलग-अलग तरीके से खींचने के तरीके में हेरफेर कर रहा हूं? यहाँ

def indexTagPosts 

     @tag = Tag.find(params[:tag]) 
     @posts = @tag.posts.all 

end 

और एक टैग को बचाने के लिए कार्रवाई है:

यहाँ नियंत्रक कार्रवाई जो पैरामीटर 'टैग' के आधार पर सभी प्रासंगिक पदों हड़पने के लिए माना जाता है है

def create 


    @post = Post.find(params[:post_id]) 
    @tag = @post.tags.create(params[:tag]) 

    respond_to do |format| 
     if @tag.save 
     format.html { redirect_to edit_post_path(@post),:notice => "Success" } 
     end 
    end 

end 

धन्यवाद अग्रिम में और अनावश्यकता या बुरी शब्दावली के लिए क्षमा चाहते हैं।

उत्तर

9

मेरी इच्छा है कि मुझे पता चले कि सभी को has_and_belongs_to_many का उपयोग करने का विचार क्यों मिला क्योंकि यह प्रबंधन में वास्तव में मुश्किल काम है, भले ही यह शुरुआत में आसान लगता है। बेहतर दृष्टिकोण has_many ..., :through प्रकार का रिश्ता होना है क्योंकि आप अलग-अलग लिंक प्रबंधित कर सकते हैं और आसानी से मेटा-डेटा जोड़ सकते हैं।

उदाहरण के लिए, यहाँ एक सरल दो तरह से एक मध्यवर्ती मॉडल के साथ शामिल हो गया है, एक पैटर्न आप मिल जाएगा अक्सर होता है: जोड़ना और इस बिंदु पर टैग लिंक को निकालने की

class Post < ActiveRecord::Base 
    has_many :post_tags 
    has_many :tags, :through => :post_tags 
end 

class Tag < ActiveRecord::Base 
    has_many :post_tags 
    has_many :posts, :through => :post_tags 
end 

class PostTag < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

तुच्छ है:

@post = Post.find(params[:post_id]) 

if (params[:tags].present?) 
    @post.tags = Tag.where(:name => params[:tags].split(/\s*,\s*/)) 
else 
    @post.tags = [ ] 
end 

has_many रिलेशनशिप प्रबंधक आवश्यकतानुसार PostTag एसोसिएशन मॉडल बना, अपडेट या नष्ट कर देगा।

आम तौर पर आप पोस्ट मॉडल विकसित का उपयोग कर जो भी विभाजक आप की तरह पुन: प्राप्त करने और टैग निर्दिष्ट करने के लिए उपयोगिता विधि शामिल करने के लिए करेंगे:

class Post 
    def tags_used 
    self.tags.collect(&:name).join(',') 
    end 

    def tags_used=(list) 
    self.tags = list.present? ? Tag.where(:name => list.split(/\s*,\s*/)) : [ ] 
    end 
end 
+1

जवाब के लिए धन्यवाद। अगर मैं टैग मॉडल के एक अलग उदाहरण के रूप में प्रत्येक टैग को लागू करने का प्रयास करता हूं, तो मुझे यकीन नहीं है कि मैं यह कैसे करूंगा। – Chazu

+1

आमतौर पर टैग मॉडल रखने का बिंदु यह है कि आप इसके साथ टैग की गई सभी चीज़ें पा सकते हैं। प्रत्येक पोस्ट के लिए एक अलग टैग होने के उद्देश्य से इस तरह की हार होगी। – tadman

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