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!