0

次のモデルがあるとします。

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
  scope :blue, where(color: 'blue')
end

のインスタンスがある場合、関連付けられているFooすべてのブルー モデルを取得する方法はいくつかあります。私の質問は、特定の関係が既に読み込まれているBarかどうかを判断することに関するものです。barsfoo

これにより、バーの完全なコレクションが既にメモリにロードされているかどうかに関係なく、データベース クエリが実行されます。

foo.bars.blue.all

barsをロードしたクエリに が含まれていた場合、これはクエリを実行しませんfoo。それらがロードされていない場合は、すべてをロードしてbarsから列挙します。

foo.bars.select { |b| b.color == 'blue' }

クエリを実行せずに、リレーションが読み込まれたかどうかを判断するにはどうすればよいですか?

foo.bars.some_method_to_determine_whether_or_not_they_are_in_memory_thanks

何か案は?

編集:

明確にするために、これは私が達成したい結果の一種です:

class Foo < ActiveRecord::Base
  has_many :bars

  def blue_bars
    if bars_already_loaded?
      # enumerate
    else
      # use the scope
    end
  end

  def red_bars
    ...
  end

  ...
end
4

0 に答える 0