Rails Vrhunski Vodič Za Join Table

Ovo je kompletan vodič za kreiranje join table za pridruživanje u Rubi on Rails. Pokazaće kako se generiše i kreira tabela spajanja i kako se adresiraju asocijacije između različitih modela. Takođe će vam pokazati kako da napišete obrazac sa više polja za odabir i kako se njime rukuje u kontroleru.

Korak 1: Kreiranje migracije

Prvo kreirajmo tablicu za spajanje na način Rails, sa referencama city i cleaner.

rails g model Assignment city:references cleaner:references

Ovo će stvoriti sledeću migraciju:

create_ assignments.rb

class CreateAssignments < ActiveRecord::Migration
  def change
    create_table :assignments do |t|
      t.references :city, index: true, foreign_key: true
      t.references :cleaner, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

Korak 2: Izmenite model

U modelu ćemo konfigurisati has_many:through association između čistača, grada i zadatka. Izjave o udruživanju mogu izgledati ovako:

cleaner.rb

class Cleaner < ActiveRecord::Base
  has_many :assignments
  has_many :cities, through: :assignments
end

city.rb

class City < ActiveRecord::Base
  has_many :assignments
  has_many :cleaners, :through => :assignments
end

assignment.rb

class Assignment < ActiveRecord::Base
  belongs_to :city
  belongs_to :cleaner
end

Ovaj primer možete pročitati na sledeći način:

Čistači kroz zadatke imaju mnogo gradova kojima su dodeljeni, dok gradovi imaju mnogo čistača kroz zadatke. I gradovi i čistači mogu imati mnogo zadataka!

Tabela zadataka povezuje čistiju i gradsku tabelu preko njihovog id-a (citi_id i cleaner_id).

Korak 3: Izmenite kontroler

Ovde biste trebali urediti svoj kontroler za čistače kako bi prihvatio city_ids u privatnoj definiciji cleaner_params .

cleaners_controller.rb

private

def cleaner_params
  params.require(:cleaner).permit(city_ids: [])
end

Obavezno pokrijte sve testovima koristeći RSpec i FactoryGirl !

Izmeni izgled prikaza

Jednom kada se postavi pozadina, preostaje vam samo da dodate prikaz.

U ovom primeru možete dodati polje za potvrdu sa višestrukim izborom, gde možemo odjednom da odaberemo više imena gradova gde se čistač može dodeliti.

form.html.erb

<%= form_for(@cleaner) do |f| %>
  <p>
    <%= f.label :cities %><br />
    <% for city in City.all %>
      <%= check_box_tag "cleaner[city_ids][]", city.id, @cleaner.cities.include?(city) %>
      <%=h city.name %><br />
    <% end %>
  </p>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Nadamo se da smo uspeli da objasnimo kako treba da napravite tablicu pridruživanja u Rails-u.

Ostanite povezani s nama baš kao što to čine ove tabele, putem pretplate na bilten!