查询has_many关系,包含这个也是这个

时间:2016-04-07 15:24:49

标签: mysql ruby-on-rails activerecord

# engine.rb
has_many :pistons

#piston.rb
belongs_to :engine

活塞有一栏piston_count,当然还有engine_id

我的数据库有以下7条记录

Engine.all
#=> [#<Engine id: 1>, #<Engine id: 2>, #<Engine id: 3>]

Piston.all
#=> [#<Piston id: 1, engine_id: 1, piston_count: 1>, #<Piston id: 2, engine_id: 1, piston_count: 2>, #<Piston id: 2, engine_id: 2, piston_count: 1>, #<Piston id: 2, engine_id: 3, piston_count: 2>]

我想写一个查询说,返回包含活塞的Engine piston_count 1并且还包含piston_count 2 < / p>

我试过......     engines = Engine.joins(:活塞).merge(Piston.where(piston_count:1))     #=&GT; [#,#]     engines.joins(:活塞).merge(Piston.where(piston_count:2))     #=&GT; []

它返回一个空数组,因为活动记录将其转换为一个AND子句。但是,如果我执行OR语句,它将返回太多记录。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

想出来。这将采用两个Active Record Queries的交叉。

engine_ids = Engine.joins(:pistons).merge(Piston.where(piston_count: 1)).pluck(:id) & Engine.joins(:pistons).merge(Piston.where(piston_count: 2)).pluck(:id)

然后返回并检索所有相交。

Engine.where(id: engine_ids)