0

単純に実行中

ElectricityProfile.find_each do |ep|
  if UserProfile.exists?(ep.owner_id) && ep.owner_type == 'UserProfile'
    ElectricityProfileSummary.create(ep)
  終わり
終わり

テーブルにデータを入力するには、年齢 (5 時間) かかります。DB を作成するためのより良い方法はありますか?

DBからすべてのデータを取得し、それを配列、ハッシュなどに保存してから、プッシュしてDBを作成するとしましょう

ElectricityProfile.find_each do |ep|
  if UserProfile.exists?(ep.owner_id) && ep.owner_type == 'UserProfile'
    array_of_electricity_profiles.push(ep)
  終わり
終わり
ElectricityProfileSummary.mass_create(ep) # => またはその他のメソッド :)

create複数のモデルを取り、ElectricityProfileSummary を作成するオーバーライドされた method があることを忘れていました。

create!(:owner_id => electric_profile.owner_id,
        :owner_type => electric_profile.owner_type,
        :property_type => electric_profile.owner.user_property_type,
        :household_size => electric_profile.owner.user_num_of_people,
        :has_swimming_pool => electric_profile.has_swimming_pool,
        :bill => electric_bill,
        :contract => electric_profile.on_contract,
        :汚い => 真、
        :provider => electric_profile.supplier_id,
        :plan => electric_profile.plan_id,
        :状態 => 状態、
        :郵便番号 => 郵便番号,
        :割引 => 割引、
        :has_air_conditioner => electric_profile.has_air_conditioner,
        :has_electric_hot_water => electric_profile.has_electric_hot_water,
        :has_electric_central_heating => electric_profile.has_electric_central_heating,
        :has_electric_cooktup => electric_profile.has_electric_cooktup
)
4

2 に答える 2

1

インポート ループを 1 つのトランザクション ブロックにラップできれば、インポートが大幅に高速化されるはずです。ROR トランザクションについては、こちらをご覧ください。

于 2012-11-16T04:54:32.747 に答える
1

ストアド プロシージャまたは生の SQL でこれを行うのがおそらく最善の方法です。ActiveRecord は、多くのレコードを処理するときに非常にコストがかかる可能性があるためです。includesただし、またはを使用すると、かなり高速化できます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 の間でポリモーフィックな関係を使用しているという前提に基づいています。そうでない場合は、お知らせください。(これは、多態的な関係に必要な 2 つのフィールドをペアとして構成する と があるためです。owner_id)owner_type

インクルードを使用する方が良いのはなぜですか? インクルードを使用すると、ActiveRecord は 2 つのモデル間の関係を積極的にロードするため、現在のように n+1 クエリを実行する必要はありません。実際には、ElectricityProfile レコードの数に基づいてレコードを作成しているため、まだ n+1 を実行していますが、現在行っていることは、単一の ElectricityProfile ごとに UserProfile をクエリしているため、n+1 よりもコストがかかります。 EP と UP の間の関係を遅延読み込みしているため、ElectricityProfileSummary を作成するときに UserProfile を再度クエリしています。

インクルードを行うと、Rails は内部結合を使用して 2 つのテーブル間でクエリを実行します。内部結合を使用すると、UserProfile が存在することを確認する必要がなくなります。内部結合は、関係の両側が存在するレコードのみを返すためです。

于 2012-11-16T05:24:59.360 に答える