ruby на рельсах выбирает activerecords с предложением where - PullRequest
0 голосов
/ 03 июня 2011

У меня простой вопрос - в основном я хочу получить все ActiveRecords некоторой модели X, которые придерживаются некоторых условий. Я пытаюсь использовать метод X.where здесь, но я не уверен, как он будет работать. По сути, моя модель X имеет много мужчин Y.

У меня есть список идентификаторов для объектов модели Y. Я хочу найти всю модель X, которая имеет хотя бы один из этих идентификаторов в своем has_many Y.

Есть ли простой способ сделать это с помощью X.where? Или мне нужно более сложный sql?

1 Ответ

0 голосов
/ 03 июня 2011

Вот что я хотел бы сделать:

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)
...