has_many
新しいand関連付けを導入するために移行を実行しましたhas many :through
。「標準」には、「layers_assoc」までの_多くの「レイヤー」があります。新しい機能は既存の標準で正常に動作しますが、新しい標準を作成しても、新しいレイヤーまたはlayers_assocsは作成されません。
デフォルトを持つ関連付けと移行を作成しても、標準の作成時に関連付けのインスタンスを作成する必要がありますか?
これは、layers_assocs テーブルの移行です。
class CreateLayersAssocs < ActiveRecord::Migration
def up
create_table :layers_assocs do |t|
t.timestamps
t.integer :layer_id, :null => false # has_many
t.integer :standard_id, :null => false # has_many
t.boolean :visible, :default => true
end
add_index :layers_assocs, :layer_id
add_index :layers_assocs, :standard_id
LayersAssoc.reset_column_information
puts "== Populating LayersAssoc table ============================"
Standard.all.each do |standard|
Layer.all.each do |layer|
begin
LayersAssoc.create!(
standard_id: standard.id,
layer_id: layer.id,
visible: true
)
rescue
puts "== Failed to populate standard_id: #{standard.id} with layer_id: #{layer.id} "
continue
end
end
end
puts "== Finished Populating LayersAssoc table ==================="
end
def down
drop_table :layers_assocs
end
end
移行が本番環境でうまくいかない場合に役立つ追加のものがいくつかあります。標準を作成した後、それは言うundefined method 'visible'
. 次に、データベースを確認すると、最新の標準がlayers_assocsテーブルにないことがわかります。
これがモデルです。standard.rb の重要な部分:
has_many :layers_assocs
has_many :layers, :through => :layers_assocs
accepts_nested_attributes_for :layers_assocs
レイヤー.rb:
has_many :layers_assocs
has_many :standards, :through => :layers_assocs
層_assoc.rb:
belongs_to :standard
belongs_to :layer
更新 2:
この問題はほとんど解決しました。LayersAssocs はデフォルトで問題なく作成されますが、標準のデフォルトのレイヤ アソシエーションを確立するものは何もありませんでした。これらのデフォルトの関連付けをbefore_filter
新しいメソッドに書き込んだところ、問題なく動作しました。ただし、 が設定されているにもかかわらずlayer_id
、規格を保存すると画層 ID が表示されなくなります。
LayersAssoc.new ループ後の LayersAssoc の例:
#<LayersAssoc id: nil, created_at: nil, updated_at: nil, layer_id: 1, standard_id: nil, visible_authors: true, visible_reviewers: true>
standard.save 時:
Mysql2::Error: Column 'layer_id' cannot be null: INSERT INTO `layers_assocs` (`created_at`, `layer_id`, `standard_id`, `updated_at`, `visible_authors`, `visible_reviewers`) VALUES ('2013-05-13 21:49:36', NULL, 112, '2013-05-13 21:49:36', 1, 1)
これは本当に混乱しています。