0

在轨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> 

这基本上是:
最后一课以29的活动标识开头
调用lesson_set上的update_attributes以尝试设置activity_id ID至3
返回true,但是当我们看一下上次的教训它并没有改变
然后设置活动ID是29,即。相同和呼叫update_attributes
activity_id仍然是29
,但然后再次调用尝试并将其设置为3
这次它更新课程。

有什么错我的代码,这似乎非常奇怪的行为给我,我不能在网络上找到类似的事情。

认为我正在头一巴掌时刻!

回答

1

随着上述
课has_and_belongs_to_many模型Lesson_sets
与会者belongs_to的Lesson_set

试图把验证的不应该是更多的参加者超过限制意味着经验和lesson_sets之间的相关性是在保存新关联之前在验证期间重置。

从lesson_set的出席者移动验证逻辑启用工作进行验证。

因此,如果您有类似的事情,请尝试将验证逻辑从加入模型移动到其加入的模型之一