随机数量的属性存在性能问题

时间:2013-06-28 12:44:01

标签: ruby-on-rails performance random attributes associations

我的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或其他格式将数据存储到收件人表中。这是一个什么样的解决方案,可以减少对数据库的查询?

0 个答案:

没有答案