0

問題は、2つのモデルAとBがHABTMに関連付けられている場合、Aの新しいインスタンスを作成するときに、RailsにA、B、A_Bではなく、AとA_Bだけに書き込むように指示する方法を教えてください。

つまり、より正確には、バルーンとカラーの2つの関連モデルがあります。

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

問題は、テーブルの色が重複したレコードを受け取らないようにすることです。バルーンを追加するたびに、関連付けを担当するテーブル(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
4

1 に答える 1

1

問題は、で使用することbuildです@ballon.colors。Buildは、新しい色を見つけるのではなく、インスタンス化します。コレクションへのメンバーの追加は通常、次のように行われます。

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

別の方法は、ネストされた属性を使用することです。

于 2013-03-15T14:04:57.893 に答える