0

3 つのテーブルがありpayment_logssourcingsRailspurchasingsアプリに含まれています。payment_log はソーシングまたは購入のいずれかに属しますが、同時に両方には属しません。project_id調達と購買の両方にコルがあります。all payment_logs with its project_id = project_id_search(検索ページから渡された project_id_search)をピックアップします。また、返される結果セットとして ActiveRecord が必要です。payment_logs が ActiveRecord の結果セットを保持していると仮定した場合の個々のクエリは次のとおりです。

  1. ソースの project_id = project_id_search を持つすべての payment_logs を選択します

    payment_logs = payment_logs.joins(:sourcing).where("sourcing.project_id = ?", project_id_search)

  2. 購入の project_id = project_id_search を持つすべての payment_logs を選択します

    payment_logs = payment_logs.(:purchasing).where("purchasings.project_id = ?", project_id_search)

project_id = project_id_search であるすべての payment_logs を取得するには、1 と 2 を結合する必要があります。それを達成する正しい方法は何ですか?rails で union が見つからず、find_by_sql が必要としない配列を返します。ありがとう。

4

1 に答える 1

1
payment_logs.where(["
  payment_logs.sourcing_id IN (
                                SELECT id FROM sourcings WHERE sourcings.project_id = ? 
                              ) 
  OR payment_logs.purchasing_id IN 
                              (
                                SELECT id FROM purchasings WHERE purchasings.project_id = ? 
                              )", project_id_search, project_id_search])

多くの SQL ですが、動作するはずです

オプション 2 (2 つの SQL 要求 ...) :

payment_logs = []
payment_logs << PaymentLog.joins(:sourcing).where("sourcings.project_id" => project_id_search)
payment_logs << PaymentLog.joins(:purchasing).where("purchasings.project_id" => project_id_search)
payment_logs.uniq! #In case some records have both a sourcing and a purchasing

オプション 3、squeelgem : https://github.com/ernie/squeel

PaymentLog.where{(source_id.in Sourcing.where(:project_id => project_id_search)) | (purchasing_id.in Purchasing.where(:project_id => project_id_search))}

私はこのソリューションが気に入っています :) また、生成された SQL に疑問がある場合はいつでも、コンソールまたはその他の場所から、ActiveRecord クエリの最後に .to_sql を追加して、生成された SQL を再確認できます。

于 2012-07-30T19:40:36.913 に答える