0

В rails 2.3.8 У меня возникают проблемы с проверкой на accepts_nested_attributes_for ассоциации, если я просматриваю или даже проверяю ассоциацию habtm при проверке уроков, загруженных и любых обновлений потеряны. Например, у меня есть следующая схема:rails validation on 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, чтобы попытаться установить Activity_ id до 3
он возвращает true, но когда мы смотрим на последний урок, он не изменился.
затем установите идентификатор активности равным 29, т.е. то же самое и вызвать update_attributes
activity_id все еще 29
, но затем снова звоните, чтобы попытаться установить его на 3
и на этот раз он обновляет урок. ???

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

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

ответ

1

С моделями выше
Урок has_and_belongs_to_many Lesson_sets
Attendee belongs_to Lesson_set

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

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

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