проверка рельсов для ассоциации acceptpts_nested_attributes_for и habtm в обновлении сбрасывает связь - PullRequest
0 голосов
/ 29 августа 2010

В rails 2.3.8 у меня возникают проблемы с проверками на ассоциации accepts_nested_attributes_for, если я проверяю цикл или даже проверяю ассоциацию habtm при проверке, загружаются уроки и все обновления теряются.Например, у меня есть следующая схема:

ActiveRecord::Schema.define(:version => 20100829151836) do

 create_table "attendees", :force => true do |t|
  t.integer  "lesson_set_id"
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
 end

 create_table "lesson_sets", :force => true do |t|
  t.datetime "created_at"
  t.datetime "updated_at"
 end 

 create_table "lesson_sets_lessons", :id => false, :force => true do |t|
  t.integer "lesson_id"
  t.integer "lesson_set_id"
 end

 create_table "lessons", :force => true do |t|
  t.integer  "activity_id"
  t.integer  "limit"
  t.datetime "created_at"
  t.datetime "updated_at"
 end
end

и следующие модели:

class Attendee < ActiveRecord::Base
 belongs_to :lesson_sets
end
class Lesson < ActiveRecord::Base
 has_and_belongs_to_many :lesson_sets
end
class LessonSet < ActiveRecord::Base
 has_and_belongs_to_many :lessons
 has_many :attendees
 accepts_nested_attributes_for :lessons
 validate do |lesson_set|
  lesson_set.lessons.each do |l| 
   if l.limit < attendees.count
    self.errors.add_to_base("Sorry only #{l.limit} people allowed on lesson")
   end
  end
 end
end

Если я назову следующее:

>> ls = LessonSet.first
=> #<LessonSet id: 1, created_at: "2010-08-29 07:50:23", updated_
at: "2010-08-29 07:50:23">
>> Lesson.last
=> #<Lesson id: 1, activity_id: 29, created_at: "2010-08-29 07:57:13", updated_a
t: "2010-08-29 17:04:34", limit: 5>
params = {"lessons_attributes"=>{"0"=>{"activity_id"=>"3", "id"=>"1", "_destroy"=>""}}, "id"=>"1"}
=> {"id"=>"1", "lessons_attributes"=>{"0"=>{"activity_id"=>"3", "id"=>"1", "_des
troy"=>""}}}
>> ls.update_attributes(params)
=> true
>> Lesson.last
=> #<Lesson id: 1, activity_id: 29, created_at: "2010-08-29 07:57:13", updated_a
t: "2010-08-29 17:04:34", limit: 5>
>> params = {"lessons_attributes"=>{"0"=>{"activity_id"=>"29", "id"=>"1", "_de>
=> {"id"=>"1", "lessons_attributes"=>{"0"=>{"activity_id"=>"29", "id"=>"1", "_de
stroy"=>""}}}
>> ls.update_attributes(params)
=> true
<y_id"=>"3", "id"=>"1", "_destroy"=>""}}, "id"=>"1"}
=> {"id"=>"1", "lessons_attributes"=>{"0"=>{"activity_id"=>"3", "id"=>"1", "_des
troy"=>""}}}
>> Lesson.last
=> #<Lesson id: 1, activity_id: 29, created_at: "2010-08-29 07:57:13", updated_a
t: "2010-08-29 17:04:34", limit: 5>
>> ls.update_attributes(params)
=> true
>> Lesson.last
=> #<Lesson id: 1, activity_id: 3, created_at: "2010-08-29 07:57:13", updated_at
: "2010-08-29 17:13:36", limit: 5>

Что в принципе:последний урок начинается с action_id из 29вызовите update_attributes для lesson_set, чтобы попытаться установить action_id на 3он возвращает истину, но когда мы смотрим на последний урок, он не изменилсязатем установите идентификатор активности равным 29, т.е.то же самое и вызвать update_attributesActivity_id все еще 29но затем позвоните еще раз, чтобы попытаться установить его на 3и на этот раз он обновляет урок .???

Что-то не так с моим кодом, мне это кажется странным, и я не могу найти в сети ничего похожего.

думаю, что яна мгновение ударить по голове!

1 Ответ

1 голос
/ 24 ноября 2010

с моделями вышеУрок has_and_belongs_to_many Урок_setsУчастник принадлежит к уроку

Попытка поставить проверку того, что число участников не должно превышать ограничение, означало, что связь между уроками и набором lesson_sets сбрасывалась во время проверки перед сохранением новой ассоциации.

Перемещение логики проверки из lesson_set в Attendee позволило проверить правильность работы.

Поэтому, если у вас что-то похожее, попробуйте переместить логику проверки из модели соединения в одну из моделей,присоединяется

...