我有一个公司模型:的Rails 3.2 + Postgres的:节省has_and_belongs_to_many即使验证失败
class Company < ActiveRecord::Base
has_and_belongs_to_many :jobs
validates :name, presence: true
end
和作业模式:
class Job < ActiveRecord::Base
has_and_belongs_to_many :companies
validates :name, presence: true
end
所有作品除了collection.create法测得的。根据Rails documentation:
collection.create方法返回关联类型的新对象。该对象将通过传递的属性实例化,通过连接表的链接将被创建,并且一旦它通过了关联模型上指定的所有验证,关联的对象将被保存。
这似乎对我来说并不正确:即使子对象无效(并且验证因为无效模型未保存而起作用),关联仍会被创建。我创造了这个单元测试来解释我如何努力做到这一点:
test "add invalid job to company" do
company = FactoryGirl.create(:company_with_job)
# I also tried:
# company.jobs << FactoryGirl.build(:job, name: "")
company.jobs.create({name: ""})
company.save
assert_equal 1, company.jobs.size
end
大小,而不是“2”,如果我检查company.jobs我得到这个:
[#<Job id: 1, name: "My Job 1", created_at: "2012-11-07 10:26:10", updated_at: "2012-11-07 10:26:10">,
#<Job id: nil, name: "", created_at: nil, updated_at: nil>]
我敢肯定,我我错过了一些愚蠢的行为,但是我一直在嘲弄我的头一阵子,似乎无法理解我做错了什么。
感谢,
摹
如果你只是做:'company.jobs.create' – apneadiving
@apneadiving完全相同的结果和输出 – gianpi
这是逻辑,做:'company.jobs.select(&:坚持?)。大小' – apneadiving