Databázová relácia has_and_belongs_to_many (HABTM) je používaná relatívne často. V Ruby on Rails ale neexistuje žiadny generátor, ktorý by poskytoval migráciu na prepájaciu tabuľku. Pri many-to-many relácii je nutnosťou. Riešenie?
Ruby gem habtm-generator – do rails projektu pridáva nový generátor.
Do Gemfile je potrebné pridať:
gem 'habtm_generator', group: :development
Následne zbundlovať:
$ bundle
Teraz už môžeme volať generátor a pohodlne robiť migrácie na prepájanie modelov:
$ rails g habtm post category
Predpokladáme, že máme dva modely – Post a Category. A konečne – príkaz generuje takúto migráciu:
# db/migrate/20170620035628_create_categories_posts.rb
class CreateCategoriesPosts < ActiveRecord::Migration
def change create_table :categories_posts, :id => false do |t|
t.references :category
t.references :post
end
add_index :categories_posts, [:category_id, :post_id],
name: "categories_posts_index",
unique: true
end
end
Migrácia automaticky obsahuje inštrukciu create_table s názvom tabuľky categories_posts. Aj keď sme uviedli názvy nie podľa abecedy, generátor ich tak zoradí ? Migrácia tiež vytvára index nad prepojeniami.
Migráciu spustíme príkazom:
rails db:migrate
V modeloch musíme mať zadefinovanú reláciu:
class Post < ApplicationRecord
has_and_belongs_to_many :categories
end
class Category < ApplicationRecord
has_and_belongs_to_many :posts
end
Čo ale gem robí automaticky a do oboch modelov pridá riadky za nás. Aké pohodlné! ?
Odteraz je HABTM v Ruby on Rails dúfam o čosi jednoduchšie. Ďakujem za čítanie!