Я хочу выполнить поиск для всех 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
, содержащему определенный атрибут?