Как запросить модель с двумя отношениями глубоко для атрибута в конечной модели? - PullRequest
0 голосов
/ 25 июня 2018

Я хочу выполнить поиск для всех Collections, которые содержат Blob.item с заголовком, соответствующим поисковому запросу.

A Collection belongs_to Blob и belongs_to User.A Blob belongs_to Item и belongs_to User.Item имеет атрибут.

Class Collection
  belongs_to :blob
  belongs_to :user
end

Class Blob
 belongs_to :item
 belongs_to :user
 has_many :collections, foreign_key: :collection_id
end

Class Item
 belongs_to :user
 has_many :blobs, foreign_key : :item_id

 validates :title, presence: true
end

Я знаю, что базовый поиск в моем collection.rb должен выглядеть примерно так:

if search
 where(["blob ILIKE ? OR user ILIKE ?", "%#{search}%", "%#{search}%"])
 else
  order('id DESC')
 end
end

Но это не работает, потому что ILIKE - это шаблон, соответствующий параметру поиска.против blob_id.Ясно, что мне нужно какое-то объединение, но мне трудно понять различия / варианты использования объединений и включает.

Если я делаю Collections.joins(:blob), я получаю SELECT "collections".* FROM "collections" INNER JOIN "blobs" ON "blobs"."id" = "collections"."blob_id", что является шагом вправильное направление, но я не могу запросить Item связь, которая has_many Blobs, потому что Item не существует на Collection.

Итак ... как быЯ пишу запрос, который ищет Collection, который принадлежит Blob, который принадлежит Item, содержащему определенный атрибут?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Предполагается, что a является атрибутом в модели Item, поэтому запрос будет выглядеть так: -

Collection.joins(blob: :item).where("items.a LIKE ?", "%{q}%");
0 голосов
/ 25 июня 2018

Вы можете использовать includes вместе с references, как показано на этой странице: https://apidock.com/rails/ActiveRecord/QueryMethods/includes

Collection.
  includes(:blob).includes(:items).
  references(:items).references(:blob).
  where('items.a LIKE ?', "%{q}%")

Простое использование includes сделает несколько запросов SQL, в то время как простое использование references не даст вам правильную информацию о коллекции.

Возможно, вам придется изменить это, исходя из ваших точных требований к запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...