如何使用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>
我如何实现这一目标?
答案 0 :(得分:1)
仅使用ActiveRecord
foo = Foo.where(:key = ?)
Bar.where(:foo_id => foo)
使用关联和eager loading:
#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)
答案 1 :(得分:0)
ActiveRecord::Base.find_by_sql("select * from bar where foo_id in
(select id from foo where key = #{key})")
答案 2 :(得分:0)
Arel 将执行此操作:
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})
假设您有一个belongs_to :foo
关联的设置栏。连接方法也将接受原始sql片段
答案 3 :(得分:0)
你应该能够做到
Bar.find_all_by_foo_id([1,2,3,4])
在这种情况下,您必须先找到所有foo ID。但是如果你在一个查询子查询中需要它,ChuckE提到的最好。