используя создать! когда acceptpts_nested_attributes включен - PullRequest
0 голосов
/ 19 марта 2012

Я использую два одинаковых способа создания записи с вложенными атрибутами.

Первый путь

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

1 Ответ

0 голосов
/ 19 марта 2012

На B ваши Хеши закрываются до того, как ваш workoutday включен.

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"}}}})

Это немного загадочно, извините, но я думаю, что это должно оказать некоторую помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...