0

まず、私はまだRORには慣れず、私のデータテーブルのデータベースクエリを行うためのより効率的な方法を考え出しています。RailsデータベースクエリROR

マイモデルの関連付けが

class Store < ActiveRecord::Base 
    has_many :surveys 
    has_many :customers 
end 
... 
class Survey < ActiveRecord::Base 
    belongs_to :store 
end 
... 
class Customer < ActiveRecord::Base 
    belongs_to :store 
end 
私のDataTableに

  <tbody> 
      <% @store.surveys.each do |survey| %> 
      <tr class="th-container table-fixer"> 
       <td><%= find_customer_id(survey.email).nil? ? survey.first_name : link_to(survey.first_name, store_customer_path(@store, find_customer_id(survey.email))) %></td> 
       <td><%= get_ltv(survey) %></td>   
      </tr> 
      <% end %> 
      </tbody> 

find_customer_idとget_ltv方法

def find_customer_id(customer_email) 
    BwCustomer.find_by(email: customer_email) 
end 

を次のようにコードの問題は、現在、私は1000以上持っている、ということですfind_customer_idメソッドがヒットしたときにループするアクティブなレコードオブジェクト指定された電子メールアドレスを持つtomerが処理されます。

私の状況では、これにアプローチするにはどうすればよいでしょうか? 1.

を必要なときので、私は唯一のオブジェクトをロードする、別のテーブルに 2.遅延ロードを呼び出す必要がないことをいくつかの提案が大幅になるためにテーブルを結合:についてはかかわらず、私が持っている

ソリューションお礼

ありがとうございます

答えて

1

あなたのお問い合わせは、電子メールIDであまり時間を取らないでください。

  1. お客様テーブルでメール列のインデックス(Active Recordの移行によってインデックスを追加するためにこれを参照してください - http://apidock.com/rails/v4.2.1/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index)を追加し二回find_customer_idを呼び出す

  2. あなたのコードを示します。あなたはラッパーメソッドを記述する必要はありません一度これだけ1データベースクエリを

  3. を解雇されたことを実行してください - Customer.find_by_email(customer_email)もさらに最適化するには

を働く、あなたが存在するかどうかを確認する必要があるすべての顧客IDを収集することができますデータベース内で1つのループで実行し、単一のデータベースクエリを起動します。 Customer.where(email: [list of customer emails])

0

主な問題は、顧客と調査の関連がないことです。あなたは電子メールで参加することで1つを作ることができます。

class Survey < ActiveRecord::Base 
    belongs_to :customer, primary_key: :email, foreign_key: :email 
end 

しかし、これはやや不慣れなアプローチです。アンケートにご記入の際に、お客様のIDをアプリケーションで把握していますか?または、誰かがこれらのアンケートを記入できるのですか?誰かが同じメールを顧客としていると主張した場合、リンクを張っていますか?

いずれの場合でも、電子メール列にインデックスを付ける必要があります。これらの間に関連付けを行う場合、コントローラコードに次のように記述することができます。

@store = Store.includes(surveys: :customer).find(params[store_id]) 

これは、あなたがループ内で使用すると、各行に対して新しいクエリを呼び出すことなくsurvey.customerを使用することができますので、表示しようとしている熱心な負荷すべての調査や顧客データベースクエリを行います。

関連する問題