Я использую два одинаковых способа создания записи с вложенными атрибутами.
Первый путь
m = Macrocycle.create!({"name"=>"sdfasdf", "description"=>"rt3t",
"mesocycles_attributes"=>[{"name"=>"34fervaav", "_destroy"=>"false", "description"=>"asdfadf", "phase_number"=>"1", "workout_days_attributes"=>{"new_1332120641337"=>{"day"=>"1", "_destroy"=>"false"}}}]})
=> #<Macrocycle id: 37, name: "sdfasdf", description: "rt3t", created_at: "2012-03-19 01:57:05", updated_at: "2012-03-19 01:57:05">
1.9.3p125 :047 > m.mesocycles[0]
=> #<Mesocycle id: 30, name: "34fervaav", created_at: "2012-03-19 01:57:05", updated_at: "2012-03-19 01:57:05", description: "asdfadf", macrocycle_id: 37, phase_number: 1>
1.9.3p125 :048 > m.mesocycles[0].workout_days
=> [#<WorkoutDay id: 2, day: 1, created_at: "2012-03-19 01:57:05", updated_at: "2012-03-19 01:57:05", mesocycle_id: 30>]
Как видите, и мезоциклы, и workout_days создаются правильно. Но если я буду использовать этот способ (вместо использования массива для child_attributes, используя хеш с уникальным ключом для каждого дочернего элемента):
m = Macrocycle.create!({"name"=>"sdfasdf", "description"=>"rt3t", "mesocycles_attributes"=>{"new_1332120631785"=>{"name"=>"34fervaav", "_destroy"=>"false", "description"=>"asdfadf", "phase_number"=>"1"}, "workout_days_attributes"=>{"new_1332120641337"=>{"day"=>"1", "_destroy"=>"false"}}}})
=> #<Macrocycle id: 38, name: "sdfasdf", description: "rt3t", created_at: "2012-03-19 02:15:39", updated_at: "2012-03-19 02:15:39">
1.9.3p125 :052 > m.mesocycles[0]
=> #<Mesocycle id: 31, name: "34fervaav", created_at: "2012-03-19 02:15:39", updated_at: "2012-03-19 02:15:39", description: "asdfadf", macrocycle_id: 38, phase_number: 1>
1.9.3p125 :051 > m.mesocycles[0].workout_days
=> []
workout_days не создается должным образом. Однако мезоциклы создаются правильно.
Не могу понять для меня, почему это происходит? Это что-то глупое, что я скучаю? Причина, по которой я спрашиваю, состоит в том, что я использую гем nested_form ryanb для создания записи в моей базе данных, а nested_form использует второй способ. На самом деле, я просто использовал хэш params непосредственно в моем примере консоли выше.
Кажется, что использование хеша с уникальным ключом для каждого ребенка работает на один уровень ниже в гнезде.
Обновление:
Код ассоциации:
Макроцикл Модель:
class Macrocycle < ActiveRecord::Base
#attr_accessible :name, :description, :mesocycles_attributes
has_many :mesocycles, :dependent => :destroy
accepts_nested_attributes_for :mesocycles, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end
Мезоцикл Модель:
class Mesocycle < ActiveRecord::Base
#attr_accessible :name, :phase_number, :description, :workout_days_attributes
belongs_to :macrocycle
#default_scope :order => 'mesocycles.phase_number ASC'
has_many :workout_days, :dependent => :destroy
accepts_nested_attributes_for :workout_days, :allow_destroy => true
end
Дни тренировок Модель:
class WorkoutDay < ActiveRecord::Base
attr_accessible :day, :blocks_attributes
belongs_to :mesocycle
has_many :blocks, :dependent => :destroy
accepts_nested_attributes_for :blocks#, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end