我有一串数据,其中包含类别。我希望维护一个类别表,该表应该仅包含我遇到的每个类别一次。
我想实现一个
我想实现一个
id = Category.upsert(name)
,它应该是原子性的(当然),并且如果可能的话不使用存储过程在数据库端。id = Category.upsert(name)
,它应该是原子性的(当然),并且如果可能的话不使用存储过程在数据库端。class Category < ActiveRecord::Base
...
class << self
def upsert(name)
transaction { self.find_or_create_by(name: name).id }
end
end
end
这个 upsert
gem 似乎就是做这个的 - 我在谷歌上搜索“upsert”时发现了它。
module ActiveRecordExtension
extend ActiveSupport::Concern
def upsert(attributes)
begin
create(attributes)
rescue ActiveRecord::RecordNotUnique, PG::UniqueViolation => e
find_by_primary_key(attributes['primary_key']).
update(attributes)
end
end
end
ActiveRecord::Base.send(:include, ActiveRecordExtension)