2010-09-05 10 views
9

हम अपने आवेदन को रेल 3 में अपग्रेड करने की योजना बना रहे हैं। एक प्लगइन जिसे हमने काफी उपयोग किया है nested_has_many_through है। यह प्लगइन पुराना प्रतीत होता है, और अब बनाए रखा नहीं है, और बस एक नए रेल 3 अनुप्रयोग में काम नहीं कर रहा है।रेल 3 नेस्टेड है_मीनी प्रश्न

एक साधारण उदाहरण:

Author.rb 
has_many :posts 
has_many :categories, :through => :posts, :uniq => true 
has_many :related_posts, :through => :categories 

Post.rb 
belongs_to :author 
belongs_to :category 

Category.rb 
has_many :posts 

किसी को भी सबसे अच्छा अभ्यास तरीका यह है, या एक काम कर Rails3 प्लगइन संभाल करने की सिफारिश कर सकते हैं?

धन्यवाद !!

+1

हाहा मैंने अभी आपका कांटा पाया http://github.com/releod/nested_has_many_thr आ गया और इस सवाल को याद किया और आपको सभी को कांटा के बारे में बताने के लिए यहां आ रहा था। और फिर मैंने आपका उपयोगकर्ता नाम देखा। अच्छा काम, मैंने बस अपने रेल 3 ऐप पर इसका परीक्षण किया और यह (ज्यादातर) काम कर रहा है। मैं पूरी रात https://rails.lighthouseapp.com/projects/8994/tickets/1152-support-for-nested-has_many-through-associations के अनुसार रेल को पैच करने की कोशिश कर रहा हूं लेकिन अटक गया। मैं आपके फोर्क के साथ एक टेम्पलेट के रूप में शुरू करूंगा, और अब मैं आगे बढ़ सकता हूं! –

+0

+1 http://github.com/releod/nested_has_many_through आपके रेल 3 फोर्क मेरे लिए भी काम करता है, रेल का उपयोग तब तक करेगा 3.1 – clyfe

उत्तर

7

यह साथ में बनाया गया है रेल 3.1: http://asciicasts.com/episodes/265-rails-3-1-overview

+0

यह निश्चित है; धन्यवाद डेविड !! – releod

+0

रेल गिवेट और रेल दूर ले जाते हैं http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-3-2-to-rails-4-0-active-record – engineerDave

0

मैं has_many: related_posts भाग से अधिक उलझन में हूं। क्या आप अनिवार्य रूप से वर्गीकृत पदों में शामिल होने की कोशिश कर रहे हैं? जैसे, 'x' श्रेणी में सभी पोस्ट को 'संबंधित' माना जाता है? संघ पर CLASS_NAME: यदि हां, तो यह वहाँ एक RelatedPost वर्ग नहीं किया जा रहा है ताकि एक न्यूनतम पर इसे ठीक करने के आधार पर काम नहीं करेंगे, आपको यह निर्दिष्ट करना चाहते हैं

has_many :related_posts, :class_name => 'Post', :through => :categories 

लेकिन दूसरी बात, यह शायद है शुरू करने के लिए सही दृष्टिकोण नहीं है। चूंकि किसी लेखक के पास google_id विदेशी कुंजी के माध्यम से पहले से ही कई पोस्ट हैं, इसलिए समूह तालिका के माध्यम से वापस बुनाई करने की कोशिश करने में कोई समझ नहीं है, इसके बजाय समूहबद्ध तर्क का उपयोग करें।

वैकल्पिक दृष्टिकोण है कि इस साफ: अगर यह तुम क्या नहीं पूरा करने के लिए कोशिश कर रहे थे था

Author.rb

has_many :posts do 
    def related 
    all.group_by(&:category_id) 
    end 
end 
author.posts.related 
=> OrderedHash 
बेशक

, यह सब विवादास्पद है। : पी

+2

मुझे लगता है कि उसका उदाहरण बढ़ गया है (इसलिए आसानी से त्रुटिपूर्ण)। उनका सवाल अभी भी मूल रूप से महत्वपूर्ण है। और मेरे सबसे अच्छे ज्ञान के लिए नेस्टेड के लिए एक कामकाजी समाधान नहीं है रेलवे 3 में कई गुना है (रेल के लिए पुराना नेस्टेड_हास_मैन_थ्रू

+0

उनके प्रश्न के बाद के हिस्से में "सर्वोत्तम अभ्यास की सिफारिश" का उल्लेख किया गया है। मेरा मुद्दा था, अगर आपके ऐप को इसकी आवश्यकता है, तो संभवतः इसे प्राप्त करने के लिए एक बेहतर तंत्र है। ;) यदि उसका उदाहरण वास्तव में विकसित होता है, तो वह अपने वास्तविक कोड को देखने में अविश्वसनीय रूप से सहायक होगा। – jenjenut233

+1

पर्याप्त मेला। निश्चित रूप से ऐसे मामलों का उपयोग किया जाता है जहां नेस्टेड में कई एसोसिएशन होते हैं (यानी गैर-रेल लोगों के लिए एकाधिक इंटर्न जॉइन का उपयोग करना) एक वैध समाधान है, और अक्सर सबसे अच्छा होता है। "लेखक - <लेख - <सब्सक्रिप्शन> - सब्सक्राइबर> - <रुचियां", 'Author.subscribers' और 'Author.subscriber_interests' दोनों को मेरी राय में घोंसला का उपयोग करने के लिए उम्मीदवार होंगे। दूसरा विकल्प उन संगठनों को कैश करना है जब किसी भी समय प्रथम स्तर के संगठन बदलते हैं, जो आदर्श से कम है। –

0

रेल 3 (अपरीक्षित, सबसे संबंधित श्रेणियों के साथ पोस्ट द्वारा आदेश पहले):

category.rb:

class Category < ActiveRecord::Base 
    class << self 
    def posts 
     Post.joins(:categories). 
      where(:categories => select('id').all.map(&:id)). 
      group('posts.id'). 
      order('count(*) DESC') 
    end 
    end 
end 

उपयोग:

related_posts = author.categories.posts 
संबंधित मुद्दे