私はRails 3.2.9を使用しており、テーブルのすべての結果を、結合の department_id によってフィルタリングされたテーブルcategories
の一致する結果に返そうとしています。incomes
SQL クエリはかなり単純です。
SELECT * FROM categories LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND dept_id = 86
これで、次の方法で目的の結果を得ることができましたjoins
。
Category.joins('LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = 86')
しかし、なぜこれを で動作させることができなかったのかわかりませんinclude
。以下は私のモデルです:
カテゴリー
class Category < ActiveRecord::Base
attr_accessible :cat_code, :cat_ds
has_many :incomes, :conditions => ['dept_id = ?', 86]
end
所得
class Income < ActiveRecord::Base
attr_accessible :category_id, :year_id,:dept_id, :note
belongs_to :category
end
希望する結果を得るためにさまざまな方法を試しましたが、上記のモデルを使用して最新の試みを説明します。
@cat_inc = Category.find(:all, :include => [:incomes])
しかしundefined method each for nil:NilClass
、しようとするとdebug(@cat_inc)
上記が上記の SQL ステートメントを生成しない理由がわかりません。何か案は?
編集
おそらくこれを表現するより良い方法ですが、どうすれば結合に条件を付けることができますか? 上記の SQL ステートメントのように:AND dept_id = 86
私が得ることができた最も近いものは次のとおりです。
Category.includes(:incomes).where("incomes.dept_id = ?", 86)
これにより LEFT OUTER JOIN が得られますがAND dept_id = 86
、結合後に条件が実行されます。
SELECT "categories"."id" AS t0_r0, "categories"."cat_code" AS t0_r1, "categories"."cat_ds" AS t0_r2, "incomes"."id" AS t1_r0, "incomes"."category_id" AS t1_r1, "incomes"."year_id" AS t1_r2, "incomes"."chart_id" AS t1_r3, "incomes"."dept_id" AS t1_r4, "incomes"."note" AS t1_r5, "incomes"."jan" AS t1_r6, "incomes"."feb" AS t1_r7, "incomes"."created_at" AS t1_r8, "incomes"."updated_at" AS t1_r9 FROM "categories" LEFT OUTER JOIN "incomes" ON "incomes"."category_id" = "categories"."id" WHERE (incomes.dept_id = 86)