Class: RuboCop::Cop::DevDoc::Migration::NoCreateJoinTable
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::DevDoc::Migration::NoCreateJoinTable
- Defined in:
- lib/rubocop/cop/dev_doc/migration/no_create_join_table.rb
Overview
Avoid ‘create_join_table` — define an explicit join model instead.
## Rationale ‘create_join_table` produces a PK-less table tied to `has_and_belongs_to_many`, which has well-known limitations: no timestamps, no per-row callbacks, and no room for extra columns without migration gymnastics.
The preferred Rails idiom is ‘has_many :through` with an explicit join model, which is just a normal table with a PK and timestamps.
❌
create_join_table :products, :categories
✔️ Define an explicit join model
create_table :product_categories do |t|
t.belongs_to :product, null: false, foreign_key: true
t.belongs_to :category, null: false, foreign_key: true
t.
end
# In models:
class Product < ApplicationRecord
has_many :product_categories
has_many :categories, through: :product_categories
end
Constant Summary collapse
- MSG =
'Avoid `create_join_table` — define an explicit join model with `has_many :through` instead.'.freeze
- RESTRICT_ON_SEND =
%i[create_join_table].freeze
Instance Method Summary collapse
Instance Method Details
#on_send(node) ⇒ Object
46 47 48 |
# File 'lib/rubocop/cop/dev_doc/migration/no_create_join_table.rb', line 46 def on_send(node) add_offense(node.loc.selector) end |