我已经运行迁移以引入新的has_many
和has many :through
关联。 “标准”通过“layers_assoc”具有_many“图层”。新功能可以在现有标准下正常工作,但创建新标准时不会创建新图层或图层_assocs。Rails has_many未在创建时填充
尽管创建了关联和具有默认值的迁移,但是在创建标准时是否必须创建关联的实例?
下面是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
layers.rb:
has_many :layers_assocs
has_many :standards, :through => :layers_assocs
layers_assoc.rb:
belongs_to :standard
belongs_to :layer
更新2: 我所有,但解决这个问题。 LayersAssocs会以默认值创建,但我没有为标准建立默认图层关联。我已经在新方法中将这些默认关联写入了before_filter
,它工作得很好。但是,尽管保存了标准layer_id
,但保存标准时,层ID将消失。
例LayersAssoc后LayersAssoc.new循环:
#<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)
这确实是混杂。
请提供您用于创建的代码。 – wintermeyer 2013-05-09 20:15:54
已添加。我会在标准模型创建动作中插入'LayersAssoc.create'模块,但这样做不必要。 – Archonic 2013-05-09 21:07:54
我认为它与标准,图层或layers_assoc模型中某处缺少'attr_writter'有关。 – Archonic 2013-05-09 22:21:56