ruby-on-rails - संघों और नेस्टेड गुणों के माध्यम से Has_Many




ruby-on-rails-4 model associations nested-attributes (2)

मैं एक दृश्य बनाने का प्रयास कर रहा हूं जिससे कि मुझे मेरी शामिल होने वाली टेबल के मूल्यों को सीधे बनाने और संपादित करने की अनुमति मिलती है इस मॉडल को 'नौकरी' कहा जाता है जब तक कोई बच्चा 2 पुस्तकों को काम पर रखता है, तब तक मेरी शामिल होने वाली तालिका में कई पंक्तियां बनाने में सक्षम होने की आवश्यकता है I मुझे कुछ परेशानी हो रही है और मुझे संदेह है कि यह मेरी संस्थाओं से नीचे है ...

मेरे पास 3 मॉडल हैं प्रत्येक बच्चे में 2 पुस्तकें हो सकती हैं:

class Child < ActiveRecord::Base
 has_many :hires
 has_many :books, through: :hires
end

class Hire < ActiveRecord::Base
 belongs_to :book
 belongs_to :child
 accepts_nested_attributes_for :book
 accepts_nested_attributes_for :child
end

class Book < ActiveRecord::Base
  has_many :hires
  has_many :children, through: :hires
  belongs_to :genres
end

नियंत्रक इस तरह दिखता है:

class HiresController < ApplicationController

...    

def new
    @hire = Hire.new
    2.times do
      @hire.build_book
    end
  end

 def create
    @hire = Hire.new(hire_params)

    respond_to do |format|
      if @hire.save
        format.html { redirect_to @hire, notice: 'Hire was successfully created.' }
        format.json { render :show, status: :created, location: @hire }
      else
        format.html { render :new }
        format.json { render json: @hire.errors, status: :unprocessable_entity }
      end
    end
  end

 ...    

private
    # Use callbacks to share common setup or constraints between actions.
    def set_hire
      @hire = Hire.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
        def hire_params
  params.require(:hire).permit(:child_id, book_attributes: [ :id, :book_id, :_destroy])
end
end

इस दृश्य को यह पसंद है:

<%= form_for(@hire) do |f| %>

    <%= f.label :child_id %><br>
    <%= f.select(:child_id, Child.all.collect {|a| [a.nickname, a.id]}) -%>

    <%= f.fields_for :books do |books_form| %>


    <%= books_form.label :book_id %><br>
    <%= books_form.select(:book_id, Book.all.collect {|a| [a.Title, a.id]}) %>
        <%# books_form.text_field :book_id #%>
    <% end %>


  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

समस्या यह है कि हैश आपके द्वारा अपेक्षा की गई किताबों के दायित्वों को नहीं जमा कर रहा है, यह सिर्फ 'किताबों' को जमा कर रहा है:

Processing by HiresController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xx", "hire"=>{"child_id"=>"1", "books"=>{"book_id"=>"1"}}, "commit"=>"Create Hire"}
Unpermitted parameter: books

मुझे संदेह है क्योंकि किराया मॉडल के लिए मेरी संस्थाएं हैं:

belongs_to :book
accepts_nested_attributes_for :book

जिसका अर्थ है कि मैं गुणों को सही ढंग से नहीं बना सकता, लेकिन मुझे यकीन नहीं है कि यह कैसे हल करे। कोई मदद महान होगी, क्या मैं इस समस्या को बुरी तरह से हल कर रहा हूँ?


Answers

Hire_param के लिए मजबूत पैरामीटर में book_attributes के लिए books_attributes को बदलने का प्रयास करें

    def hire_params
  params.require(:hire).permit(:child_id, book_attributes: [ :id, :book_id, :_destroy])
end

लघु संस्करण:

  1. प्रवासन के साथ मॉडल उत्पन्न करें

    $ rails generate model Car vendor:references name:string ...

  2. Car मॉडल यानी car.rb फ़ाइल में निम्न पंक्ति जोड़ें

    class Car < ActiveRecord::Base
      belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
    end
    
  3. अब आपके पास @car.company इंस्टेंस विधि है।

एक विस्तृत स्पष्टीकरण के लिए आगे पढ़ें [वैकल्पिक अगर आप उपरोक्त समझ गए !!]

विस्तृत संस्करण:

मॉडल Car मॉडल Vendor (जो स्पष्ट है) के साथ एक सहयोग होगा। तो टेबल cars में एक vendor_id होना चाहिए।

  1. यह सुनिश्चित करने के लिए कि cars तालिका में फ़ील्ड vendor_id मौजूद है, कमांड लाइन पर निम्न चलाएं। यह सही माइग्रेशन उत्पन्न करेगा। vendor:references महत्वपूर्ण है। उसके बाद आपके पास कई गुण हो सकते हैं।

    $ rails generate model Car vendor:references name:string

  2. अन्यथा create_table :cars लिए मौजूदा माइग्रेशन में create_table :cars लाइन t.references :vendor जोड़ें

    class CreateCars < ActiveRecord::Migration
      def change
        create_table :cars do |t|
          t.string :name
          ...
          t.references :vendor
          t.timestamps
        end
      end
    end
    
  3. अंतिम चीज जो आपको करने की ज़रूरत है वह मॉडल Car को संपादित करना है। तो इस कोड को अपनी car.rb फ़ाइल में जोड़ें

    class Car < ActiveRecord::Base
      belongs_to :company, :class_name => 'Vendor', :foreign_key => 'vendor_id'
    end
    

तीसरे चरण के बाद आपको रेल एसोसिएशन द्वारा प्रदान की गई मॉडल Car लिए निम्नलिखित उदाहरण विधियां मिलेंगी

  1. @car.company

    • जब आप @car.company करते हैं तो यह #<Vendor ...> ऑब्जेक्ट वापस करेगा। यह पता लगाने के लिए कि #<Vendor ...> ऑब्जेक्ट यह cars तालिका में vendor_id कॉलम की तलाश करेगा क्योंकि आपने उल्लेख किया है :foreign_key => 'vendor_id'

    • आप कंपनी द्वारा कार के उदाहरण के लिए कंपनी सेट कर सकते हैं

      @car.company = @vendor || Vendor.find(params[:id]) #whichever Vendor object you want
      @car.save
      

      यह कार Vendor के vendor_id फ़ील्ड में उस Vendor ऑब्जेक्ट की id को सहेज vendor_id

धन्यवाद।





ruby-on-rails ruby-on-rails-4 model associations nested-attributes