Is this a bug in Rails validations or am I doing something wrong? -
this involves validations on join table, validating activerecord on either side of join against each other. seems not behave expected, allowing violation of validation.
i want allow users able belong groups, (or groups users, it's many-to-many). user's company must match group's company. hence, usergroup
looks this:
class usergroup < activerecord::base belongs_to :user belongs_to :group validate :group_company_matches_user_company private def group_company_matches_user_company if user.company != group.company self.errors.add(:group, "company must match user company") end end end
now here test showing failure of validation:
test 'validation failure example' group = groups(:default) user = users(:manager) #default user , group have same company in db assert_equal user.company, group.company #create 2nd company company2 = user.company.dup assert_difference 'company.count', 1 company2.save! end #set group's company new one, verify user , group's company don't match group.company = company2 assert_not_equal user.company, group.company #warning!!! passes , creates new usergroup. though violates #the usergroup validation assert_difference 'usergroup.count', 1 group.users << user end #what when save group db? #no issues. group.save #this fail. have saved usergroup who's user.company != group.company #despite validation requires otherwise usergroup.all.each |ug| assert_equal ug.user.company.id, ug.group.company.id end end
using collection << object
tl:dr bypasses validation
adds 1 or more objects collection setting foreign keys collection’s primary key. note operation instantly fires update sql without waiting save or update call on parent object.
Comments
Post a Comment