0

私はRails 3.2.9を使用しており、テーブルのすべての結果を、結合の department_id によってフィルタリングされたテーブルcategoriesの一致する結果に返そうとしています。incomesSQL クエリはかなり単純です。

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)
4

1 に答える 1

0

has_manyはクラスの複数形の単語を持つべきだと思います。Railsガイドをご覧ください

于 2013-01-16T18:25:51.567 に答える