我已经进行了迁移以引入新的has_many
关联has many :through
。一个“标准”通过“layers_assoc”有 _many 个“层”。新功能在现有标准上运行良好,但创建新标准时,不会创建新层或 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>
根据标准保存:
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)
这真是令人困惑。