Почему в Rails нет метода для создания HABTM-таблицы?

15 января 2010

В очередной раз набирая те шесть строчек, которыми – по соглашению – нужно описать таблицу для связи «многие ко многим», я подумал: а почему в Rails нет готового метода для этого? Почему каждый раз надо переписывать один и тот же код, попутно вспоминая, как сделать таблицу без ID – ведь используются они только для HABTM?

Подумал и написал:

# config/initializers/create_habtm_table.rb
 
class ActiveRecord::Migration
  # create_habtm_table :posts, :tags
  def self.create_habtm_table(first_model,second_model)
    table_name = [first_model.to_s,second_model.to_s].sort.join('_').to_sym
    create_table table_name, :id => false do |t|
      t.belongs_to first_model.to_s.singularize.to_sym
      t.belongs_to second_model.to_s.singularize.to_sym
    end
    add_index table_name, (first_model.to_s.singularize+'_id').to_sym
    add_index table_name, (second_model.to_s.singularize+'_id').to_sym
  end
 
  # drop_habtm_table :posts, :tags
  def self.drop_habtm_table(first_model, second_model)
    table_name = [first_model.to_s,second_model.to_s].sort.join('_').to_sym
    drop_table table_name
  end
end


Пять комментариев. Напиши еще один
  1. Cb6a2911ccea2e4dacfe20fef6e5ee44 # 15 января 2010 why_go написал:

    говорят что HABTM – очень плохо. has_many :thought или как-то так

    1. 777894ea5153122bfa6b83f5bbf23622 # 16 января 2010 Леонид Шевцов (автор) написал:

      Почему же плохо? По-моему «плохо» – это делать лишнюю модель с бессмысленным названием типа Tagging, когда она на самом деле не нужна.

  2. 0759102fad081012ce0b52a24a618406 # 19 января 2010 why_go написал:

    http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off (найди таблицу сравнения)

    1. 777894ea5153122bfa6b83f5bbf23622 # 19 января 2010 Леонид Шевцов (автор) написал:

      Ну вот когда эти плюшки нужны – и модель нужна, а когда не нужны – то ни к чему.

  3. 2de737e4a92e1495e723393ad6ef8da0 # 17 мая 2011 rbdev (rbdev.ru) написал:

    а чего пулл реквест в rails-core не отправишь? клевая же штука

(нужна разметка?)

  • **жирный**
  • > цитата

отменить