使用 Rails 3.1,我有:
class Status < ActiveRecord::Base
has_many :participations, :dependent => :destroy
has_many :users, :through => :participations
validates :users, :presence => true
end
在我的单元测试中,我这样做:
user = User.create(:name => "Bob")
status1 = Status.create(:description => "available")
user.statuses << status1
并得到:
ActiveRecord::RecordInvalid: Validation failed: users can't be blank
但是,如果我不做最后一行:
status1.users << user
效果很好。
为什么会触发验证:
user.statuses << status1
更新:
完整测试
test "Return all statuses associated with the manager" do
manager = Manager.create(:email => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c3a5acac83a1a2b1eda0acae" rel="noreferrer noopener nofollow">[email protected]</a>", :password => "password", :password_confirmation => "password")
workshop = Workshop.create(:name => "Bob Autos")
manager.workshop = workshop
manager.save
user = User.create(:name => "a customer")
workshop.users << user
status1 = Status.create(:description => "Car is ready")
status2 = Status.create(:description => "problem with exhaust")
status3 = Status.create(:description => "parts delivered")
user.statuses << status1
user.statuses << status2
assert_equal([status1, status2], manager.statuses)
user.statuses << status3
assert_equal([status1, status2, status3], manager.statuses)
end
最佳答案
验证是针对状态
,而不是针对用户
。仅当更新模型时才会触发模型的验证,并且您实际上并未更新 User
模型(因为 statuses
是关联,而不是字段)。
如果您希望对一个对象进行验证来触发对另一个对象进行验证,则应使用 validates_linked
:
class Status
validates_associated :users
end
(不过,在相关说明中,为什么状态有许多用户?似乎状态应该只针对一个用户。)
关于ruby-on-rails - 为什么更新此模型不触发验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843707/