我是Rails的新手。今天遇到了保存关联模型的问题。
我有 2 个具有以下关联的模型,标签模型对属性“名称”具有唯一性的验证角色。
class Product < ActiveRecord::Base
has_and_belongs_to_many :tags
validates_associated :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :products
validates :name, :presence => true, :uniqueness => true
end
我要归档的是创建一个与多个标签关联的产品对象。我使用了以下功能:
def self.create_with_tags(value)
tags = []
if value.has_key? :tags
tags = value[:tags]
value.delete :tags
end
p = Product.new(value)
tags.each do |tag|
p.tags.build(:name => tag)
end
p.save!
p
end
测试代码是
p = Product.create_with_tags(:name => 'test product', :status => true, :tags =>['tag1','tag2','tag3','tag4'])
当数据库中不存在标签名称 ['tag1','tag2','tag3','tag4'] 时,测试代码可以正常工作;如果其中一个标签已经存在于数据库中,例如'tag1',则关联验证将失败并且整个创建过程回滚。
我要存档的是:如果数据库中已经存在某些标签,验证不会失败,而是找到现有标签(但未创建)并创建产品和现有标签之间的关联。例如,如果 'tag1' 已经在数据库中,则不会再次创建它,但会创建 products_tags 表中的关联。