2011-03-21 16 views
14

क्या कोई साधारण ट्यूटोरियल है जो एक साधारण मॉडल को मचान करने के लिए है जो कई से अधिक रिश्तों का उपयोग करता है?रेल 3 रिलेशनल मॉडल की मचान

+1

आपके प्रश्न को गुगल करने से मुझे यह दिया गया: http://jrhicks.net/Projects/rails/has_many_and_belongs_to_many.pdf जो मुझे आशा है कि आप – rsplak

+0

का उपयोग कर सकते हैं जो 5.5 साल पहले लिखा गया था! मुझे संदेह है कि यह रेल 3 में काम करता है। –

+0

आप वास्तव में क्या देख रहे हैं? कई से कई डिस्प्ले मुश्किल हो सकते हैं। मुझे नहीं लगता कि यह कुछ उत्पन्न करने के लिए व्यवहार्य होगा। –

उत्तर

45

यह ट्यूट मैंने रेल 3.0.5 पर रूबी 1.9.2 का उपयोग करके चरणबद्ध नीचे चरणबद्ध चरण बनाते समय लिखा है। मैंने इस्तेमाल किए गए रत्नों के लिए 'जेमफाइल' भी देखें (पूरे टेस्टएप डाउनलोड करने योग्य, लिंक 15 में अंत में है)। तो यहाँ जाता है:

1)

rails new mynewtestapp 
cd mynewtestapp 
एक जगह है जहाँ आप एक परीक्षण अनुप्रयोग बनाना चाहते हैं पर जाएं, फिर

2) फिर 2 मॉडल एक has_and_belongs_to_many संघ है कि जोड़ने

rails g scaffold book title:string author:string 
rails g scaffold user name:string age:integer 

3) तो आपको उस asssociation के लिए जॉइन-टेबल बनाने की आवश्यकता है ... डिफ़ॉल्ट रेल के नाम से तालिका के लिए एक तालिका की तलाश होगी जिसमें दोनों अक्षरों को वर्णमाला क्रम में शामिल किया गया है ... तो ऐसी तालिका बनाने के लिए माइग्रेशन बनाएं

rails g migration createBooksUsers 

4) उत्पन्न प्रवास फ़ाइल है, जो उस समय लग रहा है

class CreateBooksUsers < ActiveRecord::Migration 
    def self.up 
    end 

    def self.down 
    end 
end 

5) को संशोधित की तरह है कि इस

class CreateBooksUsers < ActiveRecord::Migration 
    def self.up 
    create_table :books_users, :id => false do |t| 
     t.integer :book_id 
     t.integer :user_id 
    end 
    end 

    def self.down 
    drop_table :books_users 
    end 
end 

6 तरह देखने के लिए खोलने के लिए) पुस्तक को has_and_belongs_to_many संघ जोड़ने और उपयोगकर्ता मॉडल, साथ ही संबंधों द्वारा जोड़े गए नए आईडी

ऐप/मॉडल/book.rb

class Book < ActiveRecord::Base 
    attr_accessible :title, :author, :user_ids 
    has_and_belongs_to_many :users 
end 

एप्लिकेशन/मॉडल/user.rb

class User < ActiveRecord::Base 
    attr_accessible: :name, :age, :book_ids 
    has_and_belongs_to_many :books 
end 

7) अब हमारे मॉडल और माइग्रेशन किया जाता है ... टेबल

rake db:create 
rake db:migrate 

बनाने (अच्छी तरह से बनाने के यदि आवश्यक हो तो नहीं हो सकता है की सुविधा देता है आप sqlite3 का उपयोग करते हैं या यदि आपने मैन्युअल रूप से उपयोग करने के लिए डेटाबेस बनाया है, तो यह उदाहरण SQLite का उपयोग करके काम करेगा, इसलिए मैंने डेटाबेस-प्रबंधन-सिस्टम स्थापित करने से संबंधित कुछ भी जोड़ा नहीं है। लेकिन जैसा कि बहुत सारे हैं और वास्तव में उपयोग करने के लिए पर्याप्त योग्य हैं, बहुत अच्छी तरह से प्रलेखित हैं, आपको उस सुंदर त्वरित के बारे में कोई मदद मिलेगी)

8) अब तय करें कि कौन सा ऑब्जेक्ट किस ऑब्जेक्ट को असाइन किया जाएगा .... आप दोनों तरीकों से ऐसा कर सकते हैं ... मैं इसे सरल रखूंगा और इसे दिखाऊंगा ... कहता है कि आपके पास केवल कुछ उपयोगकर्ता हैं और उन्हें पुस्तकों में असाइन करना चाहते हैं ...

इस बिंदु पर, मैं कहूंगा कि कुछ बाहरी मदद प्राप्त करें, जैसे बाइनरी एक्स ने सुझाव दिया ... लेकिन सादगी के लिए मैं फॉर्मेटास्टिक पर सरल_फॉर्म मणि चुनूंगा। मुझे लगता है कि हर कोई अपने पसंदीदा है ... लेकिन simple_form आप सीएसएस-स्टाइल अपनी इच्छा को पूरी उत्पादन में अधिक स्वतंत्रता देने के लिए लगता है ... इसलिए की सुविधा देता है इस बिंदु पर simple_form स्थापित करते हैं, सिर्फ

echo "gem 'simple_form', :git => 'git://github.com/plataformatec/simple_form.git'" >> Gemfile 

simple_form जोड़ने के लिए करते हैं अपने Gemfile के लिए, फिर

bundle install 

और अपने आवेदन के लिए सरल रूप स्थापित करें (यानीहमारी किताबों फार्म

किताबें अभी फार्म इस

एप्लिकेशन/विचारों/पुस्तकों/_form की तरह दिखना चाहिए संशोधित करने के लिए द्वारा

rails g simple_form:install 

9) समय config, डिफ़ॉल्ट शैलियों और भाषा फ़ाइलें) उत्पन्न करते हैं। html.erb

01 <%= form_for(@book) do |f| %> 
02  <% if @book.errors.any? %> 
03  <div id="error_explanation"> 
04   <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2> 
05  
06   <ul> 
07   <% @book.errors.full_messages.each do |msg| %> 
08   <li><%= msg %></li> 
09   <% end %> 
10   </ul> 
11  </div> 
12  <% end %> 
13  
14  <div class="field"> 
15  <%= f.label :title %><br /> 
16  <%= f.text_field :title %> 
17  </div> 
18  <div class="field"> 
19  <%= f.label :author %><br /> 
20  <%= f.text_field :author %> 
21  </div> 
22  <div class="actions"> 
23  <%= f.submit %> 
24  </div> 
25 <% end %> 

simple_form का उपयोग करना, हम सिर्फ ऊपर कोड के कुछ जगह ले सकता है (लाइनों 1 और 14 - 24) तो पूरी फ़ाइल इस प्रकार दिखाई देगा:

0,123,
01 <%= simple_form_for(@book) do |f| %> 
02  <% if @book.errors.any? %> 
03  <div id="error_explanation"> 
04   <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2> 
05  
06   <ul> 
07   <% @book.errors.full_messages.each do |msg| %> 
08   <li><%= msg %></li> 
09   <% end %> 
10   </ul> 
11  </div> 
12  <% end %> 
13  
14  <%= f.input :title %> 
15  <%= f.input :author %> 
16  <%= f.association :users %> 
17  
18  <%= f.button :submit %> 
19  
20 <% end %> 

10) अब आप अपने आवेदन शुरू करने के लिए

rails s 

, कुछ उपयोगकर्ताओं को जोड़ने तो एक किताब जोड़ सकते हैं और चाहते हो सकता है और वहाँ अपने पहले has_and_belongs_to_many रूप है: first simple_form form without special effects

11) अच्छी तरह से है कि शायद अभी तक देखने के लिए सबसे खूबसूरत चीज नहीं हो सकती है, लेकिन स्टाइलशीट का एक साधारण जोड़ थोड़ा सा मदद करेगा ... एक नई फाइल बनाएं

public/stylesheets/simple_form.css 

और पेस्ट इसे में निम्नलिखित लाइनों

/* public/stylesheets/simple_form.css */ 
.simple_form label { 
    float: left; 
    width: 100px; 
    text-align: right; 
    margin: 2px 10px; 
} 

.simple_form div.input { 
    margin-bottom: 10px; 
} 

.simple_form div.boolean, .simple_form input[type='submit'] { 
    margin-left: 120px; 
} 

.simple_form div.boolean label, .simple_form label.collection_radio, .simple_form label.collection_check_boxes{ 
    float: none; 
    margin: 0; 
} 

.simple_form .error { 
    clear: left; 
    margin-left: 120px; 
    font-size: 12px; 
    color: #D00; 
    display: block; 
} 

.simple_form .hint { 
    clear: left; 
    margin-left: 120px; 
    font-size: 12px; 
    color: #555; 
    display: block; 
    font-style: italic; 
} 

फिर पृष्ठ पुनः लोड करके ... Tadaa ... पहले हड़ताल ... after adding a default simple_form stylesheet

12) और अगर आप एक से अधिक पसंद नहीं है -choice-listboxes बस वापस करने के लिए पुस्तकों के लिए फार्म

एप्लिकेशन/विचारों/पुस्तकों/_form.html.erb

जाने के लिए और संशोधित लाइन

15  <%= f.input :author %> 

थोड़ा

15  <%= f.input :author, :as => :check_boxes %> 

बनाने के लिए चेक-बॉक्स सूची-बॉक्स से बाहर .... लेकिन ... ewww .... इस को देखने के लिए: left to right checkbox display

13) कुछ गलत लगता है ... विकल्प के बाएं से दाएं प्रस्तुति को हर समय और फिर सरल_फॉर्म ग्रीनहोर्न को परेशान करने के लिए जाना जाता है, लेकिन वास्तव में यह समस्या को हल करने में आसान है

और उस छोटे प्रारूप के मुद्दे पर, आप भी चाहना ब्रेसिज़ में अपने नाम के पीछे उपयोगकर्ता उम्र देखते हैं, जैसे 'टॉम (25)'

... ऐसा करने की सुविधा देता है 3 त्वरित सुधार

क) टिप्पणी हटाएं और में config/initializers/simple_form.rb में 2 विकल्प सेट आदेश एक div के साथ प्रत्येक बॉक्स का रैप करने के लिए और एक fieldset के अंदर चेक बॉक्स का सेट जगह

# You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none. 
    config.collection_wrapper_tag = :fieldset 

    # You can wrap each item in a collection of radio/check boxes with a tag, defaulting to none. 
    config.item_wrapper_tag = :div 

ख) हमारे simple_form.css स्टाइलशीट एक छोटे से संशोधित जोड़ने के रूप में,:

fieldset { border: 0; } 

...जब तक आप फ़ील्डसेट

सी) हमारे उपयोगकर्ता-मॉडल में 'to_label' विधि बनाते हैं, क्योंकि 'to_label' डिफ़ॉल्ट रूप से पहली विधि सरल_फॉर्म स्ट्रिंग- एक वस्तु प्रदर्शित करने के लिए प्रतिनिधित्व। एक अजीब घटना से हमारे मॉडल उपयोगकर्ता के पास 'नाम' नामक कॉलम है। नाम के रूप में एक मॉडल में एक तरीका सरल_फॉर्म भी दिखता है, हम भाग्यशाली थे कि इस ऐप ने अभी तक काम किया है। अगर हमने नाम कॉलम फोरनाम नाम दिया था, तो रेल ने उपयोगकर्ता नाम सूचीबद्ध नहीं किए थे, लेकिन डिफ़ॉल्ट-रूबी-ऑब्जेक्ट प्रस्तुतियां (ई। जी। < # उपयोगकर्ता: 52136 9 846>)। लगता है कि हम भाग्यशाली ;-)

एप्लिकेशन/मॉडल/user.rb थे

class User < ActiveRecord::Base 
    has_and_belongs_to_many :users 

    def to_label 
    "#{name} (#{age})" 
    end 

end 

और संपादित फार्म एक अच्छा रंग-रूप हो जाता है ... nice and cozy edit view

14) अब केवल शो दृश्य पुस्तक मालिकों प्रदर्शित करने के लिए या तो बहुत मुश्किल की जरूरत है ... नहीं thats, बस शो-व्यू

एप्लिकेशन/विचारों/पुस्तकों/show.html.erb

खोलने के लिए और ली जोड़ने

01 <p id="notice"><%= notice %></p> 
02  
03 <p> 
04  <b>Title:</b> 
05  <%= @book.title %> 
06 </p> 
07  
08 <p> 
09  <b>Author:</b> 
10  <%= @book.author %> 
11 </p> 
12  
13 <p> 
14  <b>Who owns a copy?</b> 
15  <%= @book.users.map {|x| x.to_label}.join ', ' %> 
16 </p> 
17  
18 <%= link_to 'Edit', edit_book_path(@book) %> | 
19 <%= link_to 'Back', books_path %> 

और पिछले नहीं बल्कि कम से कम ... शो देखने Who owns a book?

15) ठीक है, एक त्वरित ट्यूटोरियल habtm करने के लिए या शब्दों has_and_belongs_to_many संघों में इतना: एनईएस 13-16 bookowners प्रदर्शित करने के लिए रेल में मैं अपने परीक्षण एप्लिकेशन के तहत डाल दिया है मैं जबकि में इस ऑनलाइन लेखन बनाई https://1drv.ms/u/s!Alpu50oGtUZq7AiJkL08QqBiMAjb

+0

अच्छा लिखो! काफी गहन – Andrew

+0

क्या यह अभी भी रेल 3.2.3 में मान्य है? मुझे लगता है कि मैंने सही तरीके से कदम उठाए हैं लेकिन चरण 11 के बाद मुझे एक त्रुटि मिल रही है (जब कोई पुस्तक बनाने की कोशिश की जा रही है) कह रही है "संरक्षित गुणों को बड़े पैमाने पर असाइन नहीं किया जा सकता")। अगर मैं इसे गलत कर रहा हूं, तो कृपया अनदेखा करें। :) – timfreilly

+0

@ टिमफ्रेली: मैंने रेलवे 3.2.3 पर यह कोशिश नहीं की है, लेकिन "सब कुछ नया है", i। ई। रेल और सरल-रूप, मुझे लगता है कि कुछ चीजें वास्तव में अलग हैं। अफसोस की बात है कि मुझे रेल 3.1+ के साथ काम करने का अवसर नहीं मिला है, इसलिए मैं नहीं कह सकता। आपके द्वारा उल्लिखित त्रुटि संदेश को Google पर आज़माएं, मुझे यकीन है कि आपको समाधान की ओर अग्रसर लगेगा। – Ingo

0

घड़ी रयान बाते के टोकन फील्ड्स पर ट्यूटोरियल:

http://railscasts.com/episodes/258-token-fields

यह रेल में कई रिश्ते के लिए कई पाड़ के लिए एक आसान तरीका है

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