Возникает вопрос: если две модели A и B находятся в ассоциации HABTM, когда я создаю новый экземпляр A, как указать Rails не писать в A, B и A_B, а только в A и A_B?
Итак, точнее: у меня есть две связанные модели: Balloon и Color
class Balloon < ActiveRecord::Base
has_and_belongs_to_many :colors
end
class Color < ActiveRecord::Base
has_and_belongs_to_many :balloons
end
_form.html.haml содержит:
.field
= f.label :color
- Color.all.each{|c|
= check_box_tag("color[]", c.name)
= c.name
-}
и контроллер воздушного шара:
def create
@balloon = Balloon.new(params[:balloon])
params[:color].each do |col|
@balloon.colors.build(:name=>col)
end
....
Когда я сохраняю, у меня есть следующие записи в таблицах:
sqlite> select * from balloons;
1|b1
2|b2
3|b3
4|b4
sqlite> select * from colors;
1|red
2|green
3|red
4|red
5|red
sqlite> select * from balloons_colors;
1|1
1|2
2|3
3|4
4|5
Проблема в том, что я не хочу, чтобы таблица Colors получала повторяющиеся записи, я хочу, чтобы таблица, отвечающая за ассоциацию (balloons_colors), получала дополнительные записи каждый раз, когда я добавляю воздушный шар. Поэтому я хочу иметь что-то вроде
sqlite> select * from colors;
1|red
2|green
sqlite> select * from balloons_colors;
1|1
1|2
2|1
3|1
4|1
Отредактировано: добавлена схема:
sqlite> .schema balloons_colors
CREATE TABLE "balloons_colors" ("balloon_id" integer, "color_id" integer);
Эта таблица была создана следующей миграцией
class BalloonsHaveAndBelongToManyColors < ActiveRecord::Migration
def self.up
create_table :balloons_colors, :id => false do |t|
t.references :balloon, :color
end
end
.....
end