1

ActiveRecord クエリを使用して、特定の親テーブルに対応するすべての子行を選択するにはどうすればよいですか。

create table foo (id, ...)
create table bar (id, foo_id, ...)

select * from foo where key = ? 
# The above return a single row or multiple rows.

select * from bar where foo_id in <ids from the above output>

どうすればこれを達成できますか?

4

4 に答える 4

1

でクエリのみを使用するActiveRecord

foo = Foo.where(:key = ?)
Bar.where(:foo_id => foo)

関連付けと熱心な読み込みの使用:

#foo model
class Foo < ActiveRecord::Base
  has_many :bars
end

#bar model
class Bar < ActiveRecord::Base
 belongs_to :foo
end

#query
Foo.includes(:bars).where(:key => ?).collect(&:bars)
于 2013-01-02T17:11:28.393 に答える
0

アレルはこれ行います:

Profile.where(user_id: User.select("id").where(exclude_from_analytics: true))
#=> Profile Load (395.1ms)  SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`user_id` IN (SELECT id FROM `users` WHERE `users`.`exclude_from_analytics` = 1)

実際に副選択を実行するかどうかは別のことです。クエリを結合として記述してみる価値があります。

Bar.joins(:foo).where(:foos => {:key => key})

関連付けを使用して Bar をセットアップしたと仮定しますbelongs_to :foo。joins メソッドは生の SQL フラグメントも受け入れます

于 2013-01-02T17:14:29.020 に答える
0

うーん...あなたの質問が、ARelでそのようなことができるかどうかであるかどうかはわかりません(それはできません)。あなたが望むのは、サブクエリを使用して一致を提供することです。これは SQL で実行できるため、ActiveRecord::Base.find_by_sql を使用します。

ActiveRecord::Base.find_by_sql("select * from bar where foo_id in 
(select id from foo where key = #{key})")
于 2013-01-02T17:09:48.060 に答える
0

あなたはできるはずです

Bar.find_all_by_foo_id([1,2,3,4])

その場合、以前にすべての foo ID を見つける必要があります。ただし、ChuckEが言及した1つのクエリサブクエリでそれが必要な場合は最適です。

于 2013-01-02T17:17:32.103 に答える