HATBM, как писать в таблицу поиска и только в одну из связанных таблиц, а не в обе?

Возникает вопрос: если две модели 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

person Andrew    schedule 15.03.2013    source источник
comment
ваша ассоциативная таблица: баллоны_цвета неверны, не могли бы вы представить ее схему   -  person ilan berci    schedule 15.03.2013


Ответы (1)


проблема в том, что вы используете build на @ballon.colors. Build создает экземпляр нового цвета, а не находит его. Добавление члена в коллекцию обычно выполняется следующим образом:

@color = Color.find(params[:color_id]) 
@balloon.colors << @color

другой способ — использовать вложенные атрибуты.

person m_x    schedule 15.03.2013