9

मैं रेल के लिए नया हूँ, और मेरे रेल परियोजना में अनेक-से-अनेक संबंध स्थापित करने के लिए कोशिश कर रहा हूँ में कई-से-अनेक संबंध है। मेरे पास एक छोटी सी रणनीति है, लेकिन मुझे यकीन नहीं है कि यह सही तरीका है या नहीं।कैसे रेल

उद्देश्य: मेरे पास उपयोगकर्ताओं की एक तालिका है, और समूहों की एक तालिका है। उपयोगकर्ता कई समूहों का हिस्सा हो सकते हैं, और प्रत्येक समूह में कई उपयोगकर्ता हो सकते हैं।

रणनीति:

  1. उपयोगकर्ता प्रवास सेट अप नाम की: स्ट्रिंग
  2. समूह प्रवास सेट अप नाम की: स्ट्रिंग
  3. एक मेज से जुड़ें प्रवास
  4. सेट करें उपयोगकर्ता सेट करें मॉडल जैसे कि has_and_belongs_to_many होगा: समूह
  5. समूह मॉडल सेट करें जैसे कि इसमें है_and_belongs_to_many: उपयोगकर्ता

क्या यह सही रणनीति होगी? धन्यवाद! जवाब से

Railcast सारांश: -: के बाद से रणनीति उपरोक्त सीमा है कि आप अतिरिक्त संबंध-विशिष्ट जानकारी नहीं जोड़ सकते है संघ के माध्यम से उन है कि रुचि रखते हैं के लिए Railcast आप एक has_many का उपयोग करने का सुझाव देते हैं।

जांच: http://kconrails.com/tag/has_many/

उत्तर

14

सबसे पहले, मुझे लगता है, तो आप एक क्षेत्र "नाम" और एक क्षेत्र "नाम" के साथ एक समूह-मॉडल के साथ एक उपयोगकर्ता के मॉडल की है।

आपको उपयोगकर्ताओं और समूहों के बीच मॉडल की आवश्यकता है।

rails g model grouping user_name:string group_name:string 

समूहीकरण मॉडल (grouping.rb), डाल में:

belongs_to :user 
belongs_to :group 

उपयोगकर्ता के मॉडल में:

has_many :groupings, :dependent => :destroy 
has_many :groups, :through => :groupings 

और समूह में यह समूहीकरण कहते हैं -मोडेल:

has_many :groupings, :dependent => :destroy 
has_many :users, :through => :groupings 

_form फ़ाइल में संपादित या अपडेट करने के लिए उपयोगकर्ता का प्रोफ़ाइल, आपने डाला:

<div class="field"> 
    <%= f.label :group_names, "Groups" %> 
    <%= f.text_field :group_names %> 
</div> 

और अंत में, उपयोगकर्ता-वर्ग को पता होना चाहिए कि फ़ॉर्म से जानकारी के साथ क्या करना है। user.rb में सम्मिलित करें:

attr_writer :group_names 
    after_save :assign_groups 

    def group_names 
    @group_names || groups.map(&:name).join(' ') 
    end 

    private 

    def assign_groups 
    if @group_names 
     self.groups = @group_names.split(/\,/).map do |name| 
     if name[0..0]==" " 
      name=name.strip 
     end 
     name=name.downcase 
     Group.find_or_create_by_name(name) 
     end 
    end 
    end 

assign_groups खाली स्थान के दूर करता है और सभी शब्दों downcases है, तो आप बेकार के टैग्स को नहीं होगा।

अब, आप अपने या अपने प्रोफ़ाइल के शो फ़ाइल में एक उपयोगकर्ता के लिए समूह देख सकते हैं:

<p>Groups: 
    <% @user.groups.each do |group|%> 
    <%= group.name %> 
    <% end %> 
</p> 

आशा है कि मदद करता है।

+0

हमारे पास क्यों है: निर्भर =>: समूह के लिए नष्ट? – Karan

+3

क्योंकि यदि आप या तो उपयोगकर्ता या समूह को हटाते हैं तो उपयोगकर्ता समूह में और नहीं होगा। – tmaximini

+0

क्यों ['has_and_belongs_to_many'] का उपयोग नहीं करें (http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association) संबंध? यदि मध्यवर्ती तालिका में कोई अतिरिक्त फ़ील्ड आवश्यक नहीं है तो यह पूरी प्रक्रिया को सरल बना देगा। – ferdynator

3

अच्छी खबर यह है कि यह पहले से ही अच्छी तरह से प्रलेखित है।

Ruby on Rails Guide

Railscast tutorial

+0

धन्यवाद! रेलकास्ट ने वास्तव में मदद की। – Karan

+0

धन्यवाद, मुझे आपके द्वारा संदर्भित दस्तावेज़ों को बहुत उपयोगी बताया गया है। मुझे दिए गए उत्तर @The_Fritz भी पसंद आया क्योंकि यह एक संक्षिप्त उदाहरण प्रदान करता है। –