0

現在、関連付けで作成された最後のレコードを見つけようとしているスコープがあり、特定のブール値が false の場合はそれを選択します

IE Foo has_many Bar's と Bar's には bazzed という名前のブール列があります

scope :no_baz,   joins(:bars).order("bars.id DESC").limit(1).where("bars.bazzed = 'f'")

これの問題は、レールがこのクエリを次のように変換することです

SELECT "foos".* FROM "foos" INNER JOIN "bars" ON "bars"."foo_id" = "foos"."id" WHERE (bars.bazzed = 'f') ORDER BY bars.id DESC LIMIT 1

問題は、レールが where 句の後に注文と制限を呼び出していることです。私が探しているのは、注文と制限を最初に実行して、バズが false に設定されている最後のバーを見つけようとすることです。

私が達成しようとしているクエリを実行するためのネイティブな AR の方法はありますか?

編集

私は、最後のバーが false に設定されているバーを持つ foo を取得しようとしています。

4

2 に答える 2

1

わかりました、「foo」モデルのクエリにはこれをお勧めします。

Foo.bars.where("bars.bazzed = ?", 'f').all( :order => "created_at DESC").first

注: もちろん、「bazzed」列で使用する値に応じて、「f」を false に置き換えることができます。

[編集]

OK、私は問題をよりよく理解していると思うので、ここに提案がありますが、スコープクエリではなくパブリックメソッド用です。

def no_baz
  all_no_baz_foos = Array.new
  Foo.all.each do |foo|
      last_bar = foo.bars.all.order("bars.id DESC").first
      if last_bar.bazzed == 'f'
        all_no_baz_foos << foo
      end
  end
  return all_no_baz_foos
end

このメソッドは、すべての no_baz_foos レコードを含む配列を返します。私は自分のコードをテストしていないので、コードを動作させるためにいくつか変更する必要があるかもしれませんが、アイデアは理解できると思います。

「スコープ」メソッドの場合、クエリを正しくチェーンして目的の結果を得る方法が見つかりません。スコープを使用してそれを達成する方法を他の誰かが知っている場合は、解決策も聞いてうれしいです.

于 2012-04-30T15:46:09.357 に答える
0

今のところクラスメソッドを使用していますが、それに関する問題は、それが返そうとしているものであるアクティブなレコード関係ではなく、配列オブジェクトを返すことです。まだクエリを正しく実行しようとしています。

于 2012-05-01T19:05:26.767 に答える