Вот что я хотел бы сделать:
Modelx.joins(:modelys).where(:modelys => { :id => list_of_ids }).all
Другое решение, которое я предпочитаю, - это использовать области:
def Modelx < ActiveRecord::Base
has_many :modelys
has_many :modelzs
scope :has_modely_ids, lambda { |ids| joins(:modelys).where(:modelys => { :id => [*ids] }) }
scope :has_modelz_ids, lambda { |ids| joins(:modelzs).where(:modelzs => { :id => [*ids] }) }
end
, тогда вы можете делать такие вещи, как:
Modelx.has_modely_ids(y_ids).all
Modelx.has_modelz_ids(z_ids).all
modelx_with_ys = Modelx.has_modely_ids(y_ids)
modelx_with_zs = Modelz.has_modely_ids(y_ids)
или цепочка: (просто не забудьте вызвать все, когда вы действительно хотите выполнить запрос)
modelx_with_y_and_zs = Modelx.has_modely_ids(y_ids).has_modelz_ids(z_ids)
modelx_with_y_and_zs = modelx_with_ys.has_modelz_ids(z_ids)