0

简单地运行

ElectricityProfile.find_each 做 |ep|
  如果 UserProfile.exists?(ep.owner_id) && ep.owner_type == 'UserProfile'
    ElectricityProfileSummary.create(ep)
  结尾
结尾

需要很长时间(5 小时)才能填充表格。有没有更好的方法来填充数据库?

假设从数据库中获取所有数据并将其存储在数组、哈希等中,然后推送以创建数据库

ElectricityProfile.find_each 做 |ep|
  如果 UserProfile.exists?(ep.owner_id) && ep.owner_type == 'UserProfile'
    array_of_electricity_profiles.push(ep)
  结尾
结尾
ElectricityProfileSummary.mass_create(ep) # => 或任何其他方法:)

抱歉忘了提我确实有覆盖方法create,它需要多个模型并创建 ElectricityProfileSummary ...

创建!(:owner_id =>electricity_profile.owner_id,
        :owner_type =>electricity_profile.owner_type,
        :property_type =>electricity_profile.owner.user_property_type,
        :household_size =>electricity_profile.owner.user_num_of_people,
        :has_swimming_pool => 电力配置文件.has_swimming_pool,
        :bill => 电费账单,
        :contract =>electricity_profile.on_contract,
        :脏 => 真,
        :provider =>electricity_profile.supplier_id,
        :plan => 电力配置文件.plan_id,
        :状态=>状态,
        :邮政编码 => 邮政编码,
        :折扣 => 折扣,
        :has_air_conditioner => 电力配置文件.has_air_conditioner,
        :has_electric_hot_water => 电力配置文件.has_electric_hot_water,
        :has_electric_central_heating =>electricity_profile.has_electric_central_heat,
        :has_electric_cooktup => 电力配置文件.has_electric_cooktup
)
4

2 回答 2

1

如果您可以将导入循环包装到一个事务块中,它应该会极大地加快导入速度。在此处阅读有关 ROR 交易的信息。

于 2012-11-16T04:54:32.747 回答
1

在存储过程或原始 SQL 中执行此操作可能是最好的方法,因为 ActiveRecord 在处理这么多记录时可能非常昂贵。includes但是,您可以使用or来加快速度joins

看起来您只想创建 ElectricityProfileSummary 模型。我有点不确定你的人际关系如何,但假设你有以下几点:

class ElectricityProfile
  belongs_to :owner, polymorphic: true
end

class UserProfile
  has_many :electricity_profiles, as: owner
end

...你应该能够做这样的事情:

ElectricityProfile.includes(:owner).each do |ep|
  ElectricityProfileSummary.create(ep)
end

现在,我假设您使用的是 ElectricityProfile 和 UserProfile 之间的多态关系。如果不是这样,请告诉我。(我做出这个假设是因为你有owner_idand owner_type,它作为一对组成了多态关系所必需的两个字段。)

为什么使用包含更好?使用 include 会导致 ActiveRecord 急切加载两个模型之间的关系,因此您不会像现在这样进行 n+1 查询。实际上,因为您是根据 ElectricityProfile 记录的数量创建记录,所以您仍然在做 n+1,但是您现在所做的比 n+1 更昂贵,因为您正在为每个 ElectricityProfile 查询 UserProfile,然后您在创建 ElectricityProfileSummary 时再次查询 UserProfile,因为您延迟加载 EP 和 UP 之间的关系。

当您执行包含时,Rails 将使用内部连接在两个表之间进行查询。使用内部联接消除了确保 UserProfile 存在的必要性,因为内部联接只会返回关系双方都存在的记录。

于 2012-11-16T05:24:59.360 回答