Rails验证在更新中的Accepts_nested_attributes_for和HABTM关联重置协会中
-
02-10-2019 - |
题
在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>
这基本上是:
最后一课以29的活动开头
在课程_SET上调用update_attributes,以尝试将Activity_ID设置为3
它返回真实,但是当我们看最后一课时,它没有改变
然后将活动ID设置为29 IE。相同并致电update_attributes
activity_id仍然是29
但是然后再次致电尝试将其设置为3
这次它更新了课程。???
我的代码是否有问题,这对我来说似乎真的很奇怪,我在网上找不到类似的东西。
认为我要去头一击时光!
解决方案
与上面的模型
课程has_and_belongs_to_many thress_sets
与会者属于thress_set
试图对验证进行验证,即不应该更多的与会者,而不是限制意味着在验证期间,在保存新协会之前,课程和课程_SET之间的关联正在重置。
将验证逻辑从课程_SET转移到与会者,使验证能够工作。
因此,如果您有类似的东西,请尝试将验证逻辑从加入模型移动到它加入的模型之一
不隶属于 StackOverflow