我的rails应用程序中有一个收件人模型。收件人都有名字,姓氏和一些其他布尔属性。此外,这些收件人现在将获得其他属性。 用户可以拥有许多收件人,并且应该能够扩展这些收件人数据集以满足自己的需求(例如街道,邮编,城市)。大多数用户不会扩展收件人,有些会存储其他几个数据,但我不知道用户需要哪些收件人数据。为了避免街道,邮编,城市,电话号码或任何其他数据的数百个字段,我想到了一种键值存储。密钥将保存在addressee_key_labels中,以及addressee_key_value中每个收件人和addressee_key_labels的相应值。
class User < ActiveRecord::Base
has_many :addressee_key_labels, :dependent => :destroy
end
class AddresseeKeyLabel < ActiveRecord :: Base
belongs_to: user
has_many: addressee_key_values, :dependent => :destroy
end
class AddresseeKeyValue < ActiveRecord :: Base
belongs_to: addressee
belongs_to: addressee_key_label
end
class Addressee < ActiveRecord :: Base
has_many: addressee_key_values, :dependent => :destroy
after_create :create_additional_values
def create_additional_values
unless self.user.addressee_key_labels.empty?
self.user.addressee_key_labels.each do |addressee_key_label|
addressee_key_value = AddresseeKeyValue.new()
addressee_key_value.addressee_key_label_id = addressee_key_label.id
addressee_key_value.addressee_id = self.id
if self.additional
if addressee_key_label.is_secure
addressee_key_value.sec_data = self.additional[addressee_key_label.xmlname.downcase]
else
addressee_key_value.data = self.additional[addressee_key_label.xmlname.downcase]
end
end
addressee_key_value.save!
end
end
end
end
我对faker gem的测试对于许多新的收件人而言往往非常慢,每个收件人有10个额外的字段,因为我有11个插入数据库(一个用于收件人,10个用于其他字段)。当我创建1000个或更多的收件人(计划从xls-document导入的功能)时,该过程需要几分钟,因为在收件人上有一些验证。
如果不放弃回调的可能性,我该怎么做才能加快速度呢?
我考虑以json / xml或其他格式将数据存储到收件人表中。这是一个什么样的解决方案,可以减少对数据库的查询?