1

我的 Rails 应用程序中有一个收件人模型。收件人都有名字、姓氏和一些其他布尔属性。此外,这些收件人现在将收到额外的属性。用户可以有许多收件人,并且应该能够根据自己的需要扩展这些收件人数据集(例如街道、邮编、城市)。大多数用户不扩展收件人,有些人会存储其他几个数据,但我不知道用户需要哪些数据给收件人。为了避免街道、邮编、城市、电话号码或任何其他数据的数百个字段,我考虑了一种键值存储。密钥将保存在addressee_key_labels 中,每个addressee 和addressee_key_labels 的对应值都保存在addressee_key_value 中。

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

对于许多新收件人和每个收件人的 10 个附加字段,我使用 faker gem 的测试往往非常慢,因为我有 11 个插入到数据库中(一个用于收件人,10 个用于附加字段)。当我创建 1000 个或更多收件人(计划从 xls-document 导入功能)时,该过程需要几分钟,因为收件人有一些验证。

在不失去回调可能性的情况下,我能做些什么来加快速度?

我考虑将数据以 json/xml 或其他格式存储到收件人表中。这是向数据库抛出更少查询的适当解决方案吗?

4

0 回答 0